码迷,mamicode.com
首页 > 其他好文 > 详细

GreenDao自增主键踩坑记录

时间:2021-01-07 12:28:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:strong   默认值   定义   err   继承   dao   ted   operation   imu   

先说结论

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实现会以主键字段是否为空来作为调用者是否指定了主键值的依据

GreenDao自增主键踩坑记录

标签:strong   默认值   定义   err   继承   dao   ted   operation   imu   

原文地址:https://www.cnblogs.com/duanzi6/p/14235915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!