项目未从领域中删除

时间:2016-11-06 13:19:37

标签: android realm

io.realm:realm-gradle-plugin:2.0.0'
Android Studio 2.2.2

我正在尝试从域数据库中删除对象。这些项似乎被删除了。但是,当我关闭应用程序并从数据库加载项目时,已删除的项目似乎仍然有对它们的引用。这是我下面的代码,用于删除。

如果调用了删除onSuccess,我会将要删除的项目发送回Recyclerview的适配器。这是正确的方法吗?

 @Override
    public void deletePerson(final Person person, final DeleteListener deleteListener) {
        mRealm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<Person> results = realm.where(Person.class).equalTo("mId", person.getId()).findAll();
                results.deleteAllFromRealm();
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess() {
                /* send the person object back to be removed from the recyclerview after success*/
                deleteListener.onDeleteSuccess(person);
            }
        }, new Realm.Transaction.OnError() {
            @Override
            public void onError(Throwable error) {
                deleteListener.onDeleteFailure(error.getMessage());
            }

    });
}

当我加载那些被删除的人似乎在领域中有一个参考并且似乎没有被完全删除。

@Override
    public void loadPersons(final LoadPersonListener loadPersonListener) {
        if(mRealm.isClosed()) {
            mRealm = Realm.getDefaultInstance();
        }

        RealmResults<Person> personsList = mRealm.where(Person.class).findAll();
        if(personsList.size() > 0) {
            loadPersonListener.onLoadPersonSuccess(personsList);
        }
        else {
            loadPersonListener.onLoadPersonFailure("No items in the database");
        }
    }

2 个答案:

答案 0 :(得分:1)

你现在没有从王国移除任何东西,你只是在查询。此外,您正在访问您在后台线程上发送的人员,该线程应该抛出IllegalStateException。

所以而不是

@Override
 public void deletePerson(final Person person, final DeleteListener deleteListener) {
    mRealm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmResults<Person> results = realm.where(Person.class).equalTo("mId", person.getId()).findAll();
        }

你应该

@Override
public void deletePerson(final Person person, final DeleteListener deleteListener) {
    final String id = person.getId();
    mRealm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.where(Person.class).equalTo("mId", id).findAll().deleteAllFromRealm();
        }

答案 1 :(得分:0)

在您的代码中,您只能异步查询数据。对于删除,在循环查询结果时使用.remove()方法。 假设,mId是@Primary键,删除将如下所示:

RealmResults<Person> results = realm.where(Person.class).equalTo("mId", person.getId()).findFirst().removeFromRealm();