我的新书《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即可。