领域查询返回Android中的不完整结果

时间:2016-08-04 14:34:08

标签: java android realm

使用Realminsertread/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)

我将非常感谢您对此的帮助!提前谢谢!

1 个答案:

答案 0 :(得分:3)

这是因为您的ID是STRING,因此它被排序为11023 ,... 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,并在您进行交易时执行此操作。