GreenDao自增主键踩坑记录

先说结论

GreenDao的主键,如果要是用自增的话,必须将主键字段定义成简单类型的包装类型,即Integer、Long。

再探原因

GreenDao对数据表实体(这里假设为Student)生成StudentDao类时,该类会继承自AbstractDao并实现几个重要的虚方法,主要的CRUD操作都在AbstractDao已实现,而生成的StudentDao中所实现的方法起到定制化的控制作用。
这里着重说踩到的坑。如果主键定义成简单类型,生成的***Dao类中,建表语句会将主键限定成NOT NULL,hasKey方法会抛一个异常,如下所示

@Override
public boolean hasKey(JKIMUser entity) {
   throw new UnsupportedOperationException("Unsupported for entities with a non-null key");
}

而不巧的是,hasKey方法只有使用save类方法保存插入、更新数据时才会调用,如果你使用insertOrReplace插入数据,不好意思,直接插入了!简单类型的默认值0被当做了你指定的主键值(你说手动设成-1?那不就更是你指定的主键值了么!),
所以不管你怎么插入,数据表都会只有一条数据,因为第一次之后的调用都会被认为是在更新这个Key为0的记录!!!

从上面hasKey方法抛出的异常也可以看出,GreenDao的设计就是需要使用者提供可空类型的主键,当插入、更新数据时,GreenDao实现会以主键字段是否为空来作为调用者是否指定了主键值的依据

posted @ 2021-01-05 15:05  行走的段子  阅读(959)  评论(0编辑  收藏  举报