【问题标题】:Get All in Realm returns deleted ItemsGet All in Realm 返回已删除的项目
【发布时间】:2016-05-05 20:24:29
【问题描述】:

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

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 个无效项目。 我还确保使用领域浏览器删除了这些项目! 有人可以解释为什么会这样吗?

【问题讨论】:

  • 这听起来像是为了支持迭代器而进行的 0.89.0 重大更改的副作用。
  • 也许,我用的是 0.90.0

标签: android realm rx-java


【解决方案1】:

听起来您是在间接删除属于查询结果的项目,这是 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 的实现,所以我猜您的方法也做得更多,但希望您能理解。

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

【讨论】:

  • 虽然我认为你的解决方案会起作用,但问题是我使用的是干净的架构,并且我在表示层上接收结果之前对结果进行了一些映射。所以我无权访问 RealmResults 列表。我还添加了我的 evictById() 实现
  • 您的evictById 不是表示层方法。它属于可以访问列表的数据层。
猜你喜欢
  • 2011-06-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
相关资源
最近更新 更多