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

摘要:
组件化项目使用GreenDao时注意的事项:1.要在组件化中的基础库创建实体类;2.如果sycn之后不能生产Dao文件,使用AndroidStudio的Gradle插件重新build项目,如图:build之后就会生成GreenDao的相关文件了。atandroid.database.sqlite.SQLiteConnection.nativePrepareStatementatandroid.database.sqlite.SQLiteConnection.acquirePreparedStatementatandroid.database.sqlite.SQLiteConnection.prepareatandroid.database.sqlite.SQLiteSession.prepare从错误日志可以看出GreenDao内部把id转成了_id!!!导致后面操作UpAssetResultDao进行查询时出现数据异常的问题!!!

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

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

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

Android GreenDao 在组件化项目中的一个问题第1张

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

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

@Id
privateLong id;
private String name;

然后根据 id 查询:

Android GreenDao 在组件化项目中的一个问题第2张

出现异常:

 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 classProperties {
      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日 - 周三 今天活脱脱被自己坑了一把。。。。

Android GreenDao 在组件化项目中的一个问题第3张

对应的结果实体类:

Android GreenDao 在组件化项目中的一个问题第4张

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

问题代码:

resultBeanDao.insertOrReplaceInTx(mTableList);// 1 ResultBean 插入数据集合
UpAssetResult upResult
= newUpAssetResult(); ... upResult.setTaskId(pk); upResult.setResult(mTableList); //2TODO 直接用 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 进行查询时出现数据异常的问题!!!

免责声明:文章转载自《Android GreenDao 在组件化项目中的一个问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Free Online SQL Formatter【SQL server初级】数据库性能优化三:程序操作优化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用GreenDao 添加字段,删除表,新增表操作

GreenDao 给我个人感觉 比一般的ORM框架要好很多,虽然说上手和其他的比起来,较复杂,但是如果使用熟练以后,你会爱上这个框架的 用这些ORM 框架给我的感觉都是,当升级时,都需要进行数据库所有表的删除,然后再重新创建表,这样的话,开发时候可以,但是真正的项目用,这是不允许的,因为如果用户升级了数据库,那么所有数据都被清空,会让用户反感。卸载应用的可...

GreenDao3.0新特性解析(配置、注解、加密)

Greendao3.0release与7月6日发布,其中最主要的三大改变就是:1.换包名 2.实体注解 3.加密支持的优化 本文里面会遇到一些代码示例,就摘了官方文档和demo里的例子了,因为他们的例子已经写的很好了。 一、GreenDao3的配置 3.0相比2.0的配置较为方便,不用新建Module等一系列操作,可以直接在build.gradle里配置并...

Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点(一)

引言 总所周知,SQLite——内嵌于Android中一个占用内存极小的关系型,作为我们Android存储领域中重要的一员 ,或多或少都曾接触到数据库。即使Android系统中提供了很多操作SQLite的API,可是在业务开发中还是须要手动去编写原生SQL语句,这不仅复杂、不好维护。更重要的是不高效,经常会由于SQL语句写错而添加了开发成本,于是便出现...