Android数据库GreenDao的使用
Android 平台上的数据库框架是非常多的,但是有一个共同特点就是基于对象关系映射模型的。实现的目标也都是不需要写 SQL 语句,通过对对象的操作保存和操作数据。
- 优点
- 高性能;
- 最小的内存消耗;
- 小库大小(<100KB)以保持较低的构建时间并避免65k方法限制;;
- 数据库加密:greenDAO支持SQLCipher,以确保用户的数据安全;
- 易于使用的强大API,涵盖关系和连接;
GreenDao3.2的使用
gradle配置
在主项目(Project)的build.gradle中添加依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
在模块(Module)的build.gradle中添加依赖
greendao {
schemaVersion 版本号
daoPackage '生成数据库类的包名'
targetGenDir 'src/main/java'
}
dependencies {
implementation 'org.greenrobot:greendao:3.2.0'
}
创建Bean对象(表名和字段名)
@Entity
public class Test{
//必须要有且为Long类型
@Id(autoincrement = true)
private Long id;
private String name;
}
注解说明:
- @Entity:告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作
- @Id:对象的Id,使用Long类型作为EntityId,否则会报错。(autoincrement = true)表示主键会自增,如果false就会使用旧值
- @Property:可以自定义字段名,注意外键不能使用该属性
- @NotNull:属性不能为空
- @Transient:使用该注释的属性不会被存入数据库的字段中
- @Unique:该属性值必须在数据库中是唯一值
- @Generated:编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
创建实体之后点击Buile–Make Preject就会在我们配置的包名下生成数据库文件主要有DaoMaster、DaoSession、实体Dao三个文件。
初始化数据库
public class MyApplication extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
//配置数据库
setupDatabase();
}
/**
* 配置数据库
*/
private void setupDatabase() {
//创建数据库
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "Test.db", null);
//获取可写数据库
SQLiteDatabase db = helper.getWritableDatabase();
//获取数据库对象
DaoMaster daoMaster = new DaoMaster(db);
//获取Dao对象管理者
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoInstant() {
return daoSession;
}
}
使用数据库
使用增删改查
MyApplication.getDaoInstant().getTestDao.insert(Test);
MyApplication.getDaoInstant().getTestDao.delete(Test);
MyApplication.getDaoInstant().getTestDao.update(Test);
MyApplication.getDaoInstant().getTestDao.loadAll();
条件查询 (查询name为张三的数据)
MyApplication.getDaoInstant().getTestDao.queryBuilder().where(TestDao.Properties.Name.eq("张三")).list();
关键字 | 说明 |
---|---|
whereOr | whereOr里的语句使用“或”连接 |
where | where语句里面写的条件都是用“且”连接 |
orderDesc | 以字段降序 |
orderAsc | 以字段升序排序 |
.limit() | 查询限制当页个数 |
offset | 忽略查询出的前n条结果 |
eq | 值相同 |
notEq | 值不同 |
like | 模糊查询 |
gt | 相当于 > |
ge | 相当于 >= |
lt | 相当于 < |
le | 相当于 <= |
isNull | 为空 |
notIsNull | 不为空 |
count | 查询总个数 |
数据库升级
每次修改数据库实体后都要重新编译一下才能生效,但是如果设备上已存在旧版数据库就会报错,需要修改数据库版本号才能正常使用,但是会覆盖旧版的数据库,会导致旧版数据丢失,那么如何在旧版数据库的基础上修改表的字段还保留旧版数据呢。这里使用一个第三方框架GreenDaoUpgradeHelper(greenDao的数据库升级帮助类),使用它可以很容易解决数据库升级问题。
在配置Greendao的build中添加配置:
implementation 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0'
创建一个新类继承DaoMaster.OpenHelper添加构造函数并实现onUpgrade方法,在onUpgrade方法升级代码即可,参数为所有的Dao类:
public class DbOpenHelper extends DaoMaster.OpenHelper {
public DbOpenHelper(Context context, String name) {
super(context, name);
}
public DbOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//把需要管理的数据库表DAO作为最后一个参数传入到方法中
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
}, TestDao.class);
}
}
这样就可以在不清除覆盖旧版数据库的基础上升级数据库了,那么修改初始化方法如下,使用方法不变:
public class MyApplication extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
//配置数据库
setupDatabase();
}
/**
* 配置数据库
*/
private void setupDatabase() {
DbOpenHelper helper = new DbOpenHelper(this, "test.db", null);
daoSession = new DaoMaster(helper.getWritableDatabase()).newSession();
}
public static DaoSession getDaoInstant() {
return daoSession;
}
}