green dao 返回的结果都是相同的??
问题来源
今天写程序尝试从sqlite db中取出一个列表,orm用的是greendao,代码如下:1234List<SolveStep> solveSteps= solveStepDao.queryBuilder() .where(SolveStepDao.Properties.PuzzleId.eq(puzzleId)) .orderAsc(SolveStepDao.Properties.Sequence) .build().list();
结果取出来的结果都是相同的,且都为数据库中的第一条记录:
解决过程
按照我解决问题的思路,首先去google搜索如下关键字.greendao result same error,然后打开前几个结果.竟然都和我的问题没关系.我陷入了深深的沉思.
- 莫不是数据库中的数据就是相同的?仔细查询发现并不是.
- 莫不是greendao的缓存机制出了问题?看了一会文档,觉得
list()
这个函数没什么问题. - 莫不是android studio 或者设备出了问题? 全部重启,问题还在.
- 哪里写错了触发了隐藏bug? 没有啊…以前也是这么写的…
- 真的是灵异事件???
我觉得这样下去是解决不了问题的.从头分析一下吧
- list中都是同一个对象的引用.
- list中的那个对象是正确结果集中的第一个.
所以是由于某种原因导致greendao查询完第一个结果之后不再继续查询.转而从缓存中拿数据.
那么greendao是根据什么来判断缓存中已经有这个记录了呢?ID,我赶紧打开model来看.12345678910111213@Entitypublic class SolveStep {@Idprivate Integer puzzleId;private Integer stepNo;private String pointToMove;private Integer direction;private Integer id;
这里的 puzzleId并不是主键,而是外键.也是查询的条件.真正的主键是 Id,@Id
这个注解标错了位置.才导致了这个问题的出现.
感悟
谷歌不是万能的.它拯救不了一个傻逼,遇到问题还是要从蛛丝马迹推断,以及不细心的话不仅考不了高分.写代码效率也会特别低.