OrmLite: Unable to run insert stmt on object && ormlite does not have an id field

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情

在用OrmLite操作数据的create或update的时候,即调用createOrUpdate函数,发现数据库会报错,内容如下:
“Unable to run insert stmt on object xxxx”,插入失败。
通过阅读源码,发现createOrUpdate并未走到update流程,而是走到create流程:
在这里插入图片描述
因为我们传入的data的id一直都是0,因为我们设置了data中的id字段(A字段)是自增长的(generatedId = true),data中另外一个字段(B字段)是unique的(uniqueIndex = true)。因此比如我们改动了data中普通的一个字段(C字段),按道理来说系统能够找的到这条数据,并且更新数据,而不是重新插入一条新数据。但是却是报错。

因为我们每次更新记录的时候,不会都去根据unique的字段取回一次对应的id,因此传入的id都是=0,这样导致系统ID id = extractId(data);查出来的id都是0,而我们自增长的字段从1开始,因此永远!=0。

那是否只有uniqueIndex的字段就行了呢?我们把id字段去掉,结果仍然报错:
“does not have an id field”,意思是需要一个id字段。

查询OrmLite的说明文档:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Persisted-Types

With our Account example class, the string name field has been marked
with id = true. This means that the name is the identity column for
the object. Each account stored in the database must have a unique
value for the name field – you cannot have two rows with the name
“John Smith”.

里面清晰地告诉我们必须有一个id = true的字段,来表明这个字段是这条记录的唯一标志符,这样我们在插入或者更新的时候就能根据这个字段找到对应的记录。

因此,解决方案就是在一个字段的@DatabaseField中标记id = true即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值