[英]Realm Query Returns Incomplete Results Set In Android
使用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
時(0)
因為ID從(0)
開始,意味着表中有11個項目(0)
,我收到了Realm Primary Key Exception
,該Realm Primary Key Exception
基本上是在抱怨我試圖添加一個已經存在的對象。
我明確地調用realm.copyToRealm(obj)
而不是realm.copyToRealmOrUpdate(obj)
因為這是我想要做的。 僅在執行Edit時才允許更新。
我被困在這里,似乎無法找出導致此問題的原因!
更多信息
我在用:
compile 'io.realm:realm-android:0.87.4'
非常感謝您的幫助! 提前致謝!
這是因為你的ID是一個STRING
,因此它的排序為1
, 10
, 2
, 3
,... 9
。
這意味着當您已經插入"10"
時評估“下一個ID”時,
lastCashOrderId = Integer.parseInt(cashOrders.last().getId());
lastCashOrderId
將為9,並且您將再次插入10
。
解決方案:將long
id用作long,或者重新考慮您的自動增量ID(例如,使用UUID.randomString()
或其他名稱)
PS,當您更新到較新的Realm版本時,應使用findAllSorted()
而不是findAll().sort()
以獲得一致的行為。
編輯:請使用long newId = realm.where(CashOrder.class).max("age").longValue() + 1;
評估新ID,並在進行交易時執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.