使用copyToRealmOrUpdate方法在android中未更新领域数据

时间:2016-12-27 17:18:11

标签: java android android-studio realm

我正在尝试使用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();
}

我的FirstTime课程就像这样

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 个答案:

答案 0 :(得分:2)

方法copyToRealmOrUpdate()将:

  • 如果你给它一个非托管对象,那么

    • 如果在Realm中找不到具有给定主键的托管RealmObject,则它将使用该给定主键将新项插入到Realm中

    • 如果在Realm中找到具有给定主键的托管RealmObject,则它会将对象中的所有字段保存到托管的RealmObject中(因此更新了具有给定主键的对象)< / p>

  • 如果你给它一个托管对象,那么

    • 如果托管的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教程很垃圾,你应该引用this article series及其corresponding Github repository来代替。