greenDao3经常遇到的坑

android数据库框架greenDao相较于其他数据库框架有多快这里就不再赘述了,但事情总是两面的,个人感觉greendao有多快,也就有多坑,话不多说,直接看货:
1、依赖到你的项目里

  1. 在项目的根build.gradle添加如下依赖classpath ‘org.greenrobot:greendao-gradle-plugin:3.2.2’:
    greenDao3经常遇到的坑_第1张图片

  2. 在你的module的build.gradle文件先添加以下插件、版本、依赖配置:

greenDao3经常遇到的坑_第2张图片
greenDao3经常遇到的坑_第3张图片
具体依赖
2.一坑

schemaVersion主要用于版本升级,当你新版本的APP更改了某个表结构时,那么为了不在覆盖安装后出现崩溃现象,如果不需要保留原数据库数据直接升级,可以把schemaVersion版本号递增就行了,greendao会将上个版本的表数据直接清掉,再重新创建新的表。这里的一个表就是一个被标记的javaBean。

3.二坑

完成了以上操作后,首先、必须、一定要先定义一个javaBean类,用Entity注解为greendao的表,并声明一个Long类型的表id,如下图
greenDao3经常遇到的坑_第4张图片
然后重新编译或运行一下你的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数据库中了。如下图:
greenDao3经常遇到的坑_第5张图片

5.坑四 一对一

一对一的使用场景是当你的javaBean内还有一个内部类javaBean时,如果你还需要把内部类javaBean的数据也存入数据库的话,就需要用到ToOne注解,如果不需要存入内部类数据,则只需要用Transient注解将该字段标记即可。

greenDao3经常遇到的坑_第6张图片

6.五坑 一对多

一对多的使用场景是当你的javaBean里有List类型的数据时。这里又分两种情况,一种是List里面的元素是基本数据类型,另外一种情况是List里面的元素是一个javaBean。

6.1、List元素是基本数据类型,如String:

greenDao3经常遇到的坑_第7张图片

  当list里面的元素为基本数据类型时,我们可以通过PropertyConverter类将所有元素转化拼接为一个字符串,再存入数据库中,当然,取出来的时候也是在PropertyConverter中将传入的字符串逆转为List即可。

下面就是上图中GrDStringConverter类的转化代码:

/**
 * PropertyConverter第一个泛型指的是需要转化的List类型,第二个泛型指的是
 * List元素最终被解析拼接成String类型
 */
public class GrDStringConverter implements PropertyConverter, String> {

    /**
     * 从数据库中取出并逆转为List
     * @param databaseValue
     * @return
     */
    @Override
    public List convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        List list = Arrays.asList(databaseValue.split(","));
        return list;
    }

    /**
     * 将源数据List元素拼接为String存入数据库
     * @param entityProperty
     * @return
     */
    @Override
    public String convertToDatabaseValue(List 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时

greenDao3经常遇到的坑_第8张图片

7、待填的坑

7.1、一对一或一对多时保存主表数据不会自动把子表数据一并保存,子表数据还是要手动代码保存

7.2、同样,一对一或一对多时,查询主表数据不会自动将子表数据一并返回

或许是我打开的姿势不正确,以上两个待填的坑有解决方法的同学留言赐教一下,谢谢。

你可能感兴趣的:(安卓基础)