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


因此,在第一个代码部分中,第一个Timber给出1,可以,但是第二个Timber

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


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

最佳答案

方法copyToRealmOrUpdate()将:


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


如果在具有给定主键的领域中找不到托管RealmObject,则它将使用该给定主键将新项插入到Realm中
如果在Realm中找到具有给定主键的托管RealmObject,则它将对象中的所有字段保存到托管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();


这是一个具有新主键的新对象,因此将其复制到领域中。

为了修改现有托管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);
});




附言:Ravi Tamada Realm教程是垃圾,您应该参考this article series及其corresponding Github repository

关于java - 使用copyToRealmOrUpdate方法在Android中未更新 Realm 数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41349380/

10-08 20:46