【问题标题】:Android Realm - RealmObject returning after deletionAndroid Realm - RealmObject 删除后返回
【发布时间】:2017-07-19 02:46:59
【问题描述】:

我遇到了一个问题,我删除了一个 RealmObject(并使用 StethoRealm 确认它已经消失),但是当我创建并保存一个具有相同变量值的新 RealmObject 时,删除的 RealmObject 与我的新 RealmObject 一起重新出现。

使用下面的对象 - 我通过匹配“id”来删除 myObject1,但是当我创建一个具有相同“名称”的新 MyObject myObject2 时,两个对象都出现在我的领域中

关于为什么会发生这种情况的任何提示?

例子:

public class MyObject extends RealmObject {

@PrimaryKey
private String id;

private String name;

// getters and setters

}

编辑

删除通话

@Override
public void deleteMyObjectById(final String id, final OnDeleteMyObjectById callback) {
    Realm realm = new MyRealmConfiguration().getDefaultRealm();

    final RealmResults<MyObject> myObjects = realm.where(MyObject.class).equalTo(RealmTable.MyObject.ID, id).findAll();

    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            myObjects.deleteAllFromRealm();

            if (callback != null) {
                callback.onSuccess();
            }
        }
    });
    realm.close();
}

添加通话

@Override
public void addMyObject(MyObject myObject, OnSaveMyObjectCallback callback) {
    Realm realm = new MyRealmConfiguration().getDefaultRealm();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealmOrUpdate(myObject);

            if (callback != null) {
                callback.onSuccess();
            }

        }
    });
    realm.close();
}

【问题讨论】:

  • 我不知道您使用 Real 删除和创建新对象的方式,但您应该使用领域实例进行删除,然后获取一个新的领域实例进行创建,如果您使用现有领域实例创建,它仍然是对旧数据库的引用,然后删除的对象仍然出现
  • 以上代码不足以排查这个问题。您能否添加一些代码,包括删除和创建对象?
  • where I delete a RealmObject (and confirm its gone using StethoRealm), but when I create and save a new RealmObject with the same variable value, the deleted RealmObject reappears along with my new RealmObject. 所有这些代码都应该包含在问题中!
  • 编辑:添加保存/删除方法
  • 谢谢@Naz。 deleteMyObjectByIdaddMyObject 在主线程上运行吗?

标签: android realm


【解决方案1】:

我不确定您是如何删除对象的。我删除它们的方式(并且有效)是......

final RealmResults<UserCredentials> credentialResults = realm.where(UserCredentials.class).findAll();

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        credentialResults.deleteAllFromRealm();
    }
});

realm.close();

当然,您使用的是 MyObject 而不是 UserCredentials,并且您不会删除该类型的所有内容,但它应该足够相似。如果您还没有,请尝试使用 executeTransactionrealm.close()

【讨论】:

  • 和我做的一模一样,只是在获得 RealmResults Realm realm = new MyRealmConfiguration().getDefaultRealm();
  • 等等,您使用的是自己的配置,但获取的是默认的 Realm 实例?如果您使用自定义 Realm 配置,则必须以不同的方式实例化 Realm
  • MyRealmConfiguration 覆盖 getDefaultRealm 以返回我的自定义配置
【解决方案2】:

试试这样的。获取事务方法中的实例并删除。我一直在为我的一个应用程序使用它。它适用于删除过程

 Realm realm = Realm.getDefaultInstance();
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                RealmResults<MyObject> myObjects = realm.where(MyObject.class).equalTo(RealmTable.MyObject.ID, id).findAll();
                myObjects.deleteAllFromRealm();
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多