使用Realm
到insert
和read/query
数据时,我的行为非常不寻常。以下是准确发生的事情:
初始状态
当我开始向数据库插入数据时,一切正常。我有以下代码来处理autoIncrementingId
,因为我还没有找到提供此功能的Realm
版本!
CashOrder cashOrder = new CashOrder();
realm.beginTransaction();
int lastCashOrderId;
RealmResults<CashOrder> cashOrders = realm.where(CashOrder.class).findAll();
cashOrders.sort("id", Sort.ASCENDING);
if (cashOrders.isEmpty()){
cashOrder.setId("0");
}else{
lastCashOrderId = Integer.parseInt(cashOrders.last().getId());
cashOrder.setId(String.valueOf(lastCashOrderId + 1));
}
//the rest of the code here
//then copyToRealm here;
realm.copyToRealm(cashOrder);
realm.commitTransaction();
问题
将数据插入database
工作正常,但 id 值达到10
时 - 表示我自己的身份证明开始于{{1我得到一个(0)
基本上抱怨我正在尝试添加一个已经存在的对象。
我明确地调用了Realm Primary Key Exception
而不是realm.copyToRealm(obj)
,因为这就是我想要做的。执行修改时,只允许更新。
我被困在这里,我似乎无法弄清楚造成这个问题的原因!
更多信息
我正在使用:
realm.copyToRealmOrUpdate(obj)
我将非常感谢您对此的帮助!提前谢谢!
答案 0 :(得分:3)
这是因为您的ID是STRING
,因此它被排序为1
,10
,2
,3
,... 9
。
这意味着当您评估&#34;下一个ID&#34;当您已插入"10"
时,
lastCashOrderId = Integer.parseInt(cashOrders.last().getId());
lastCashOrderId
将为9,您将再次插入10
。
解决方案:将long
id用于long,或重新考虑自动增量ID(f.ex.使用UUID.randomString()
或其他内容)
P.S。在更新到较新的Realm版本时,应使用findAllSorted()
而不是findAll().sort()
来保持一致的行为。
编辑:请使用long newId = realm.where(CashOrder.class).max("age").longValue() + 1;
评估新ID,并在您进行交易时执行此操作。