public RealmList<CategoriesDto> getListOfCategories(String type){
final RealmList<CategoriesDto> listOfCategories = new RealmList<>();
final CategoriesDto categoriesDto = realm.where(CategoriesDto.class).equalTo("identifier", type).findFirst();
if (categoriesDto != null) {
realm.beginTransaction();
RealmResults<CategoriesDto> categories = realm.where(CategoriesDto.class).equalTo("parentId", categoriesDto.getCategoryId()).findAll();
for (int i = 0; i < categories.size(); i++) {
listOfCategories.add(categories.get(i));
}
// realm.commitTransaction();
}
return listOfCategories;
}
我在一个方法中查询了两次领域,并且出现此错误,我在每次查询后都尝试了realm.beginTransaction()
和realm.commitTransaction()
。
还有一件事:此查询仅从领域数据库中读取数据。
Ror在数据库中写入数据我们通常使用commit来保存数据。
我也试过realm.commitTransaction()
,但我收到同样的错误。
答案 0 :(得分:2)
经过多次尝试后终于得到了答案
当我通过应用for循环添加领域对象时
而不是我使用领域方法copyFromRealm()
,
下面是一段代码
listOfCategories.addAll(realm.copyFromRealm(categories));
由此我认为没有必要应用提交和开始事务,因为我们只执行读操作。
答案 1 :(得分:1)
我在使用一些RealmObjects更新和循环数组时遇到了同样的问题。
我在交易条件
之前添加了这个if(realm.isInTransaction()){
realm.commitTransaction();
}
希望这有帮助。
答案 2 :(得分:1)
如果在持续时间你拥有所有类别DTOS:
public class CategoriesDto extends RealmObject {
@PrimaryKey
private String categoryId;
@Index
private String identifier;
@Index
private String parentId;
private CategoriesDto parent;
//getters, setters
}
然后你做
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(dtos);
RealmResults<CategoriesDto> children = realm.where(CategoriesDto.class)
.isNotNull("parentId")
.isNull("parent")
.findAll();
for(CategoriesDto category : children) {
CategoriesDto parent = realm.where(CategoriesDto.class).equalTo("categoryId", category.getParentId()).findFirst();
category.setParent(category);
}
realm.insertOrUpdate(children);
}
});
然后你可以做
public RealmResults<CategoriesDto> getListOfCategories(String type) {
return realm.where(CategoriesDto.class)
.equalTo("identifier", type)
.equalTo("parent.categoryId", categoriesDto.getCategoryId())
.findAll();
}
但在您的情况下,您只需要打开一个交易,然后使用copyFromRealm()
。在这种情况下,我不确定您为什么要使用RealmList<T>
。