Real in Realm返回已删除的项目

时间:2016-05-05 20:24:29

标签: android realm rx-java

我实现了一个使用rx-java从realm数据库获取数据集的Recycler视图。当我从数据集中删除项目然后调用获取所有项目时,我会收到剩余的项目以及我刚刚删除但无效的项目。

Observable.defer(list -> {
        boolean isDeleted = true;
        for (int i = 0; i < list.size(); i++)
            isDeleted = isDeleted && evictById(list.get(i));
        return Observable.just(isDeleted);
    }).subscribe(new Subscriber{
        @Override
        public void onCompleted() { }

        @Override
        public void onError(Throwable e) { }

        @Override
        public void onNext(Boolean success) {
            if (success) 
                getUserList();
        }
    });

boolean evictById(final int itemId){
    mRealm = Realm.getDefaultInstance();
    RealmModel toDelete = mRealm.where(UserRealmModel.class).equalTo("userId", itemId).findFirst();
    if (toDelete != null) {
        mRealm.beginTransaction();
        RealmObject.deleteFromRealm(toDelete);
        mRealm.commitTransaction();
        return !RealmObject.isValid(toDelete);
    } else return false;
}

public void getUserList(){
   Observable.from(Realm.getDefaultInstance().where(UserRealmModel.class).findAll())
             .subscribe(new Subscriber<List<UserRealmModel>> {
                  @Override
                  public void onCompleted() {
                      hideViewLoading();
                  }

                  @Override
                  public void onError(Throwable e) {}

                  @Override
                  public void onNext(List<UserViewModel> users) {
                      showUsersCollectionInView(users);
                  });
}

例如,数据集有10个项目,我删除了3个项目。在getUserList响应中,我收到10个项目的列表,其中包含7个有效项目和3个无效项目。 此外,我确保使用领域浏览器删除项目! 有人可以解释为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:0)

听起来你是间接删除属于查询结果的项目,并且它是正确的,它是0.89的突破性变化的一部分。相反,您应该直接从查询结果中删除它们。

public boolean evictById(UserRealmModel obj) {
  obj.deleteFromRealm()
  return true;
}

// should be

public boolean evictById(RealmResults list, int index) {
  list.deleteFromRealm(index);
  return true;
}

您没有提供evictById的实施方式,因此我猜测您的方法也做得更多,但希望您明白这一点。

在删除某些对象之后运行的任何查询都不应该包含已删除的对象。