java.lang.IllegalStateException:不允许嵌套事务。每次beginTransaction()后使用commitTransaction()

时间:2016-07-26 15:21:55

标签: android realm

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(),但我收到同样的错误。

3 个答案:

答案 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>