我想知道是否有任何方式像List<>一样管理RealmResults。有没有一种简单的方法来实现通过事务添加特定的索引功能?我的意思是我想从一个位置获取项目并将其放在数据库中的其他位置,最好不使用需要对象中的特定字段进行排序的排序。我希望将位置反映为项目所在的索引。
总结一下,如何做到这一点 - > realmResults.add(INDEX,object);使用领域交易? 同样在插入时,我需要将对象放入数据库的第一个索引中。
答案 0 :(得分:2)
我们talked about this on Reddit,解决方案是明确添加字段position
,并使用findAllSorted(MyObjFields.POSITION)
,只要添加新元素,就会自动更新。
要对适配器中的数据集进行实际重新排序,对于较小的数据集,我建议创建结果列表的非托管副本,重新排序,然后将其保存回后台线程。
List<Obj> unmanagedList = realm.copyFromRealm(results);
//...
realm.executeTransactionAsync(new Realm.Transaction() {
public void execute(Realm realm) {
for(int i = 0; i < unmanagedList.size(); i++) {
Obj obj = unmanagedList.get(i);
Obj managedObj = realm.where(Obj.class).equalTo(ObjFields.ID, obj.getId()).findFirst();
if(managedObj != null) {
managedObj.setPosition(i);
}
}
}
});
唯一的优势是,如果添加了新元素,非托管列表不会自动更新。如果确实需要明确处理,那么RealmChangeListener<RealmResults<Obj>>
可用于存储为字段变量的结果集。