2016-12-27 118 views
0

我想添加和使用领域,像这样领域数据未更新的Android使用copyToRealmOrUpdate方法

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不为空和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; 
} 

}

的getFirstTime()在RealController是这样

public FirstTime getFirstTime() { 

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

所以在第一代码部分,第一木材是给1,这是好的,但在第二木材即

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

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

+0

你正在使用什么版本的Realm?这个'RealmController'看起来与使用0.82.1的Ravi Tamada教程非常相似,并且显示了不好的做法。 – EpicPandaForce

+0

...此外,您没有更新数据库中的数据,您正在插入一个新值。 – EpicPandaForce

+0

是的,它来自Ravi Tamada的教程,并没有copyToRealmOrUpdate更新数据库? – theanilpaudel

回答

2

的方法copyToRealmOrUpdate()将:

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

    • 如果没有管理RealmObject与给定的主键的领域找到,那么它将使用给定的主键将新项目插入领域

    • 如果在领域中发现了受管理的RealmObject,则使用giv连接主键,然后它会保存所有字段从对象到托管RealmObject(所以给定的主键被更新的对象)

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

    • 如果管理RealmObject属于同一境界,是从同一个线程,则立即返回

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); 
}); 

PS:本拉维玉田境界教程是垃圾,您应该参考this article series以及其corresponding Github repository