green dao 返回的结果都是相同的??

Author Avatar
贾康 7月 21, 2017

问题来源

今天写程序尝试从sqlite db中取出一个列表,orm用的是greendao,代码如下:

1
2
3
4
List<SolveStep> solveSteps= solveStepDao.queryBuilder()
.where(SolveStepDao.Properties.PuzzleId.eq(puzzleId))
.orderAsc(SolveStepDao.Properties.Sequence)
.build().list();

结果取出来的结果都是相同的,且都为数据库中的第一条记录:
upload successful

解决过程

按照我解决问题的思路,首先去google搜索如下关键字.greendao result same error,然后打开前几个结果.竟然都和我的问题没关系.我陷入了深深的沉思.

  1. 莫不是数据库中的数据就是相同的?仔细查询发现并不是.
  2. 莫不是greendao的缓存机制出了问题?看了一会文档,觉得list()这个函数没什么问题.
  3. 莫不是android studio 或者设备出了问题? 全部重启,问题还在.
  4. 哪里写错了触发了隐藏bug? 没有啊…以前也是这么写的…
  5. 真的是灵异事件???

我觉得这样下去是解决不了问题的.从头分析一下吧

  1. list中都是同一个对象的引用.
  2. list中的那个对象是正确结果集中的第一个.
    所以是由于某种原因导致greendao查询完第一个结果之后不再继续查询.转而从缓存中拿数据.
    那么greendao是根据什么来判断缓存中已经有这个记录了呢?ID,我赶紧打开model来看.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Entity
    public class SolveStep {
    @Id
    private Integer puzzleId;
    private Integer stepNo;
    private String pointToMove;
    private Integer direction;
    private Integer id;

这里的 puzzleId并不是主键,而是外键.也是查询的条件.真正的主键是 Id,@Id这个注解标错了位置.才导致了这个问题的出现.

感悟

谷歌不是万能的.它拯救不了一个傻逼,遇到问题还是要从蛛丝马迹推断,以及不细心的话不仅考不了高分.写代码效率也会特别低.