Android原生的api不方便之处
1.需要手动拼写sql
2.要自己写操作库的代码
3.不能自动的把数据库中的数据映射成对象
4.没有实现级联查询
GreenDao的好处
1.可以快速的开发数据库
了解GreenDao
1.GreenDao是一个android的开源框架
2.ORM(Object relation mapping)将数据库中的数据映射成数据库的对象,所有的开发语言都是 面向对象的操作而数据库的基于关系型的,java操作的都是对象,这样操作对象就可以过了
主流的开源框架
1.OrmLite
通过配置注解的操作,使用简单,也可以实现ORM机制i,性能差
2.SugarORM
也可以实现ORM
3.LItePai
可以实现多表的级联查询和数据库的升级降解
4.GreenDao
性能好
DaoMaster : 使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。最后,DaoSession对象还跟踪身份范围。有关更多详细信息,请查看
Dao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。
(1)@Entity 实体标识
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(2)@Id 每条数据对应的位置,必写项
(3)@Property(nameInDb = “”) 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库 中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
(4)@NotNull 不为null
(5)@Unique 唯一约束 该属性值必须在数据库中是唯一值
(6)@ToMany 一对多
(7)@OrderBy 排序
(8)@ToOne 一对一 关系表
(9)@Transient 不保存于数据库
(10)@generated 由greendao产生的构造函数或方法
GreenDao基本使用步骤
1.添加依赖
在build.gradle里添加依赖
compile 'org.greenrobot:greendao:3.2.2' // add library
compile 'org.greenrobot:greendao-generator:3.2.2
2.在工程的bulid.gradle里面添加
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}
}
3.对greendao的generator生成文件配置
添加在头部
apply plugin: 'org.greenrobot.greendao'
greendao {
schemaVersion 1 //版本
daoPackage '生成文件包名' // 一般为app包名+生成文件的文件夹名
targetGenDir 'src/main/java' //生成文件路径
}
4.创建实体的Dao文件
id不要忘了加自增
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "NAME")
private String name;
}
创建完成之后再User类中按Ctrl+F9刷新会出现以下文件
5.通过Application调用自动生成的三个类的数据库的操作
private static App app;
private DaoMaster.OpenHelper data;
private SQLiteDatabase database;
private DaoMaster daoMaster;
private DaoSession daoSession;
不要忘了咋清单文件里面初始化
@Override
public void onCreate() {
super.onCreate();
app = this;
setDataBase();
}
public static App getInstance(){
return app;
}
private void setDataBase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
data = new DaoMaster.DevOpenHelper(this, "data", null);
database = data.getWritableDatabase();
daoMaster = new DaoMaster(database);
daoSession = daoMaster.newSession();
}
public SQLiteDatabase getDatabase() {
return database;
}
public DaoSession getDaoSession() {
return daoSession;
}
6.在Activity中调用Application中的方法做删改查
text = findViewById(R.id.text);
number = findViewById(R.id.number);
userDao = App.getInstance().getDaoSession().getUserDao();
}
public void insert(View view) {
User user = new User(null, "李世强");
userDao.insert(user);
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
}
public void delete(View view) {
String trim = number.getText().toString().trim();
int i = Integer.parseInt(trim);
User user = new User((long)i, "李世强");
userDao.deleteByKey(user.getId());
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
}
public void update(View view) {
String trim = number.getText().toString().trim();
int i = Integer.parseInt(trim);
User user = new User((long)i , "李世强0.0");
userDao.update(user);
Toast.makeText(this, "xuigai成功", Toast.LENGTH_SHORT).show();
}
public void select(View view) {
List users = userDao.loadAll();
String temp = "";
for(int i = 0 ; i < users.size() ; i++){
temp += ","+users.get(i).getName();
temp += users.get(i).getId();
}
text.setText(temp);
}