android数据库框架greenDao相较于其他数据库框架有多快这里就不再赘述了,但事情总是两面的,个人感觉greendao有多快,也就有多坑,话不多说,直接看货:
1、依赖到你的项目里
-
在项目的根build.gradle添加如下依赖classpath ‘org.greenrobot:greendao-gradle-plugin:3.2.2’:
-
在你的module的build.gradle文件先添加以下插件、版本、依赖配置:
2.一坑
schemaVersion主要用于版本升级,当你新版本的APP更改了某个表结构时,那么为了不在覆盖安装后出现崩溃现象,如果不需要保留原数据库数据直接升级,可以把schemaVersion版本号递增就行了,greendao会将上个版本的表数据直接清掉,再重新创建新的表。这里的一个表就是一个被标记的javaBean。
3.二坑
完成了以上操作后,首先、必须、一定要先定义一个javaBean类,用Entity注解为greendao的表,并声明一个Long类型的表id,如下图
然后重新编译或运行一下你的module,以生成DaoMaster和DaoSession。
3、暴露全局的DaoSession
在上步生成了DaoMaster和DaoSession后,可以在程序初始化的时候声明一个全局性的DaoSession对象,以后就通过这个DaoSession对象来操作数据库:
private DaoSession daoSession;
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "yjb-db");
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
public DaoSession getDaoSession() {
return daoSession;
}
4、三坑
当你服务器返回的json数据中有 _id(下划线接id)这个字段时,一定、一定、一定要注意了!greenDao数据库的表中键默认就是 _id,所以,如果你的javaBean中也有 _id这个字段的话,编译的时候就会报错了。为了解决这个问题,你可以用com.google.gson包下的SerializedName注解将 _id这个字段序列化成其他名称,或者用greendao的属性:@Property(nameInDb = “设置的列名”) 设置新的列名,然后就可以存入greendao数据库中了。如下图:
5.坑四 一对一
一对一的使用场景是当你的javaBean内还有一个内部类javaBean时,如果你还需要把内部类javaBean的数据也存入数据库的话,就需要用到ToOne注解,如果不需要存入内部类数据,则只需要用Transient注解将该字段标记即可。
6.五坑 一对多
一对多的使用场景是当你的javaBean里有List类型的数据时。这里又分两种情况,一种是List里面的元素是基本数据类型,另外一种情况是List里面的元素是一个javaBean。
6.1、List元素是基本数据类型,如String:
当list里面的元素为基本数据类型时,我们可以通过PropertyConverter类将所有元素转化拼接为一个字符串,再存入数据库中,当然,取出来的时候也是在PropertyConverter中将传入的字符串逆转为List即可。
下面就是上图中GrDStringConverter类的转化代码:
/**
* PropertyConverter第一个泛型指的是需要转化的List类型,第二个泛型指的是
* List元素最终被解析拼接成String类型
*/
public class GrDStringConverter implements PropertyConverter<List<String>, String> {
/**
* 从数据库中取出并逆转为List
* @param databaseValue
* @return
*/
@Override
public List<String> convertToEntityProperty(String databaseValue) {
if (databaseValue == null) {
return null;
}
List<String> list = Arrays.asList(databaseValue.split(","));
return list;
}
/**
* 将源数据List元素拼接为String存入数据库
* @param entityProperty
* @return
*/
@Override
public String convertToDatabaseValue(List<String> entityProperty) {
if (entityProperty == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for (String link : entityProperty) {
sb.append(link);
sb.append(",");
}
return sb.toString();
}
}
6.2、List元素是javaBean时
7、待填的坑
7.1、一对一或一对多时保存主表数据不会自动把子表数据一并保存,子表数据还是要手动代码保存
7.2、同样,一对一或一对多时,查询主表数据不会自动将子表数据一并返回
或许是我打开的姿势不正确,以上两个待填的坑有解决方法的同学留言赐教一下,谢谢。