GreenDao自增主键踩坑记录

技术文章 11个月前 完美者
1,117 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

版权声明:完美者 发表于 2021-01-07 12:28:53。
转载请注明:GreenDao自增主键踩坑记录 | 完美导航

暂无评论

暂无评论...