组件化项目使用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(, String.class, "id", true, "ID");
public final static Property TaskId = new Property(, String.class, "taskId", false, "TASK_ID");
public final static Property TaskNum = new Property(, String.class, "taskNum", false, "TASK_NUM");
public final static Property Zcfdd = new Property(, 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 进行查询时出现数据异常的问题!!!

Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14的更多相关文章

  1. 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick

    wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...

  2. AE创建组件失败,项目中已存在对esri.arcgis.***的引用

    AE创建组件失败,项目中已存在对esri.arcgis.***的引用 解决办法:在解决方案资源管理器的引用中把错误提示中的引用删掉,再创建组件就没问题了.

  3. Android构建项目时出现的小bug们(2018年5月19日19:31:20)

    问题详情 Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency ...

  4. 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能

    在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...

  5. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  6. 项目中的一个分页功能pagination

    项目中的一个分页功能pagination <script> //总页数 ; ; //分页总数量 $(function () { // $("#pagination"). ...

  7. 如何在 GitHub 的项目中创建一个分支呢?

    如何在 GitHub 的项目中创建一个分支呢? 其实很简单啦,直接点击 Branch,然后在弹出的文本框中添加自己的 Branch Name 然后点击蓝色的Create branch就可以了,这样一来 ...

  8. oracle性能优化(项目中的一个sql优化的简单记录)

    在项目中,写的sql主要以查询为主,但是数据量一大,就会突出sql性能优化的重要性.其实在数据量2000W以内,可以考虑索引,但超过2000W了,就要考虑分库分表这些了.本文主要记录在实际项目中,一个 ...

  9. Java项目中每一个类都可以有一个main方法

    Java项目中每一个类都可以有一个main方法,但只有一个main方法会被执行,其他main方法可以对类进行单元测试. public class StaticTest { public static ...

随机推荐

  1. 自动化测试-3.selenium8种常用元素定位

    自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位. 元素定位在这四个环节中是至关重要 ...

  2. uboot kernel 博客

    https://blog.csdn.net/zqixiao_09/ https://home.cnblogs.com/u/lifexy/ https://blog.csdn.net/chenliang ...

  3. Python 使用sys.exc_info自己捕获异常详细信息

    一般程序中,我们需要对异常进行捕获来保证程序的健壮.但是debug的时候,我们可能需要异常的详细信息,这时可以使用sys.exec_info来处理: import traceback import s ...

  4. Linux下FTP服务器(vsftpd)配置:

    1. vsftpd 安装:yum install vsftpd 2. 添加用于: useradd admin -d /home/data -s /sbin/nologin usermod -d /ho ...

  5. es6学习日记3

    函数的扩展 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); } ...

  6. 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍

    本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...

  7. error: invalid use of void expression

    void*类型定义的指针变量只可以接收对象的地址,而没有对象类型这个概念.所以void*指针变量是不能直接用“*指针变量”去访问,需要强制类型转换后才能“间接”访问: *(type*)指针变量,必须给 ...

  8. PythonStudy——阶段总结

    每个数据类型的最大特点是什么? (1)int整型:用于存放整形对象,是不可变类型.若将一个整数赋值给一个变量名,python可自动将其设置为int型. 例如:age = 30 这里的age对象的typ ...

  9. PLC 通讯

    几个之前整理的高级语言与PLC通讯的资源下载链接:三菱:http://blog.sina.com.cn/s/blog_16d7d3ecb0102x6wj.html倍福:http://bbs.elecf ...

  10. zabbix_agent添加到系统服务启动(八)

    Centos6.5上安装了zabbix_agent后,需要把zabbix_agent添加到系统服务启动,要不然每次要一长串路径再启动,挺麻烦的. 步骤: 1)拷贝zabbix解压包里的zabbix_a ...