• Android GreenDao 在组件化项目中的一个问题


      

      组件化项目使用GreenDao时注意的事项:

    1.要在组件化中的基础库(domain层)创建实体类;

    2.如果sycn之后不能生产Dao文件,使用 Android Studio 的Gradle插件重新build项目,如图:

    build之后就会生成 GreenDao的相关文件了。

    3.GreenDao还有一个巨坑的地方,就是你的Bean里的主键不要命名为 “id” ,比如酱紫:

    @Id
    private Long id;
    private String name;

    然后根据 id 查询:

    出现异常:

     android.database.sqlite.SQLiteException: 
      no such column: id (code 1): , while compiling: SELECT T."_id",T."NAME" FROM "USER" T where id between ? and ? at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)

    从错误日志可以看出 GreenDao内部把 id 转成了 _id !!!所以说我们在建实体的时候要避免命名为 id,而是换用其他的 名称。

    当然,在接口已经出好不便修改的情况下,有两种方案:

      一是我们在做 查询的切记用 _id 去查,或是用GreenDao建表时生成的大写 ID 去查询;

      二是用 Dao 中的 Properties.Id 去做查询

     public static class Properties {
          public final static Property Id = new Property(0, String.class, "id", true, "ID");
         public final static Property TaskId = new Property(1, String.class, "taskId", false, "TASK_ID");
          public final static Property TaskNum = new Property(2, String.class, "taskNum", false, "TASK_NUM");
          public final static Property Zcfdd = new Property(3, String.class, "zcfdd", false, "ZCFDD");
    ...
    }

    查询操作:

    QueryBuilder<User> builder = userDao.queryBuilder();
    List<User> userList3 = builder.where(UserDao.Properties.Id.gt(1005)).build().list();

    附上 Demo :

    https://github.com/javakam/IShiQing/tree/412f22176af2d66fecba26145fbefed4a69efcc1/app/src/main/java/com/ishiqing/modules/greendao

    4.GreenDao查询数据一个为空,一个不为空的问题。

    2018年7月12日 - 周三 今天活脱脱被自己坑了一把。。。。

    对应的结果实体类:

    问题出现在每次用 UpAssetResultDao 查询的时候都查不全,一个有result集合,另一个却为空数组。。

    问题代码:

    resultBeanDao.insertOrReplaceInTx(mTableList);// 1 ResultBean 插入数据集合
    UpAssetResult upResult
    = new UpAssetResult(); ... upResult.setTaskId(pk); upResult.setResult(mTableList); //2 TODO 直接用 List<UpAssetResult> list = upAssetResultDao.loadAll(); 数据不全的问题 // List<UpAssetResult> dataList = new ArrayList<>(); // dataList.add(upResult); upAssetResultDao.insertOrReplaceInTx(upResult);

    L.e("resultBeanDao size :" + resultBeanDao.count());//3 插入成功

    错就错在红色字体处,UpAssetResult 实体是通过外建关联 ResultBean 的id进行数据绑定的,

    红色部分在ResultBean外面又封装了一层 List 虽然数据也能成功插入到ResultBean的数据库表中,但是没有关联上 UpAssetResult

    实体。导致后面操作UpAssetResultDao 进行查询时出现数据异常的问题!!!

  • 相关阅读:
    第二部分 设计类型:第8章 方法
    centos7 网卡重命名
    centos7修改主机名
    修改umask值
    mysql表字段属性
    mysql基础操作
    mysql错误代码ERROR 1045 (转载)
    sed高级用法
    shell拷贝原文件到目标对应文件夹
    函数(位置传参)
  • 原文地址:https://www.cnblogs.com/jooy/p/9270585.html
Copyright © 2020-2023  润新知