zoukankan      html  css  js  c++  java
  • 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 进行查询时出现数据异常的问题!!!

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/jooy/p/9270585.html
Copyright © 2011-2022 走看看