2016-12-27 22 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