标签: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实现会以主键字段是否为空来作为调用者是否指定了主键值的依据。
标签:strong 默认值 定义 err 继承 dao ted operation imu
原文地址:https://www.cnblogs.com/duanzi6/p/14235915.html