Realm 数据不会更新在 android 使用 copyToRealmOrUpdate 方法

发布时间: 2017/3/19 17:18:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想添加和检索数据使用 Realm ,喜欢这

RealmController realmController = RealmController.with(this).getInstance();

    FirstTime firstTime = new FirstTime();
    firstTime.setFirstTime(1);
    realmController.addFirstTime(firstTime);
    Timber.d("firs time %s",realmController.getFirstTime().getFirstTime());


    FirstTime firstTime1 = new FirstTime();
    firstTime1.setFirstTime(2);
    realmController.addFirstTime(firstTime1);
    Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());

realmController 不是 null 和 realmcontroller.addFirstTime() 方法是像这样

public void addFirstTime(FirstTime firstTime){
    Timber.d("adding first time %s",firstTime.getFirstTime());
    realm.beginTransaction();
    realm.copyToRealmOrUpdate(firstTime);
    realm.commitTransaction();
}

我第一次上课就是这样

public class FirstTime extends RealmObject{
//0 = firstime; 1 = not firstime
@PrimaryKey
int firstTime;

public int getFirstTime() {
    return firstTime;
}

public void setFirstTime(int firstTime) {
    this.firstTime = firstTime;
}

}

在 RealController getFirstTime() 就是这个样子

public FirstTime getFirstTime() {

    return realm.where(FirstTime.class).findFirst();
}

所以在第一个的代码部分,第一批木材给 1,但第二个木材即也没关系

Timber.d("firs time updated %s",realmController.getFirstTime().getFirstTime());

应该给我更新后的值是 2,但它给我 1,旧的值。

解决方法 1:

方法 copyToRealmOrUpdate() 将︰

  • 如果你给它一个非托管的对象,然后

    • 如果还有没有托管的 RealmObject 发现在 Realm 与给定的主键,然后它将插入到一个新的项目 Realm 与该给定的主键

    • 如果有托管的 RealmObject 发现在 Realm 与给定的主键,然后它将保存所有的字段从对象到托管 RealmObject (所以更新的对象与给定的主键)

  • 如果你给它一个托管的对象,然后

    • 如果托管的 RealmObject 属于同一 Realm 是从相同的线程,则立即返回

.

if (object instanceof RealmObjectProxy && ((RealmObjectProxy)object).realmGet$proxyState().getRealm$realm() != null && ((RealmObjectProxy)object).realmGet$proxyState().getRealm$realm().getPath().equals(realm.getPath())) {
    return object;
}

在你的情况,您将创建一个新的非托管对象

FirstTime firstTime1 = new FirstTime(); // unmanaged object

然后你将它设置新的主关键字值,以前在数据库中找不到

firstTime1.setFirstTime(2); // setting primary key

然后您将其添加到数据库

realm.beginTransaction();
realm.copyToRealmOrUpdate(firstTime1); // copy, or update if primary key exists in db
realm.commitTransaction();

这是一个新的对象与一个新的主键,所以它被完全复制到 Realm

要修改现有的托管的 RealmObject,你将需要要么修改现有的实例,通过获取托管的 RealmObject 通过查询︰

realm.executeTransaction(... {
    FirstTime time = realm.where(FirstTime.class).equalTo("id", 1).findFirst();
    time.setSomeValue("blah"); // <-- update the instance in db
});

或使用 copyToRealmOrUpdate() (或 insertOrUpdate() ) 具有相同的主键值︰

final FirstTime time = new FirstTime();
time.setId(1); // existing ID
time.setSomeValue("blah"); // new value for field
realm.executeTransaction(... {
    //realm.copyToRealmOrUpdate(time); //if you do not use the managed proxy, use insertOrUpdate() instead
    realm.insertOrUpdate(time);
});

P.S.: Ravi Tamada Realm 教程是垃圾,你应该参考本系列文章以及其对应的 Github 库相反。

赞助商