Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
组件化项目使用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 :
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 进行查询时出现数据异常的问题!!!