2015-07-21 98 views
0

在我的android應用程序,我堅持一個鍛鍊對象領域。在我的活動之一,我創建了一個對象,此代碼:在領域的數據變化android

    realm.beginTransaction(); 

        Workout w = realm.createObject(Workout.class); 

        w.setmWorkoutId(UUID.randomUUID().toString()); 

        realm.commitTransaction(); 

這裏是我的鍛鍊類:

public class Workout extends RealmObject 
{ 
private String mWorkoutId; 

private int restSecsLeft; 

private boolean prevSetOver = true; 
private boolean workoutOver = false; 

public Workout() 
{ 

} 

public String getmWorkoutId() { 
    return mWorkoutId; 
} 

public void setmWorkoutId(String mWorkoutId) { 
    this.mWorkoutId = mWorkoutId; 
} 



public int getRestSecsLeft() { 
    return restSecsLeft; 
} 

public void setRestSecsLeft(int restSecsLeft) { 
    this.restSecsLeft = restSecsLeft; 
} 



public boolean getPrevSetOver() { 
    return prevSetOver; 
} 

public void setPrevSetOver(boolean prevSetOver) { 
    this.prevSetOver = prevSetOver; 
} 


public boolean getWorkoutOver() { 
    return workoutOver; 
} 

public void setWorkoutOver(boolean workoutOver) { 
    this.workoutOver = workoutOver; 
    } 

} 

我有一個創建鍛鍊後運行的服務,和調試奇後行爲,找到了一個實例,其中保存在鍛鍊RealmObject中的「prevSetOver」的值與從w.getPrevSetOver()返回的值不同。我不知道這是如何發生的 - 在實例化對象後,我不更改變量prevSetOver的值。我是一個新領域的用戶,不明白這是如何發生的。我已經看過的圖片是w.prevSetOver()方法的截圖,RealmObject具有不同的值。

在這個屏幕中,調試器中有更多的變量,爲了簡單起見,我把它們中的大部分留在了我的文章中。

enter image description here

+0

你應該使用'executeTransaction()',而不是'開始/ commitTransaction()' – EpicPandaForce

回答

2

這是境界的正確行爲。

Realm在編譯時生成繼承自Workout的代理對象。並且從/向Realm讀取/寫入數據實際上是由代理對象通過重寫getter/setter來實現的。 Real的原始對象的成員字段不會被更改。

Realm.createObject()被調用時,它確實會返回一個代理對象,其成員字段不符合您的預期。

您仍然可以通過調用Workout w = new Workout()來創建原始模型對象的一個​​實例,我們稱其爲獨立對象(意味着它不由領域管理)。這就像普通的Java對象一樣。您還可以通過致電w = realm.copyToRealmOrUpdate(w)將其複製到Realm。請注意,我們將w的值更改爲返回值。該函數將返回一個由Realm現在管理的Proxy對象。

0
realm.beginTransaction(); 
Workout w = realm.createObject(Workout.class); 
w.setmWorkoutId(UUID.randomUUID().toString()); 
realm.copyToRealm(w); //<-- u need 
realm.commitTransaction(); 

是最好加的PrimaryKey,改變üString變量long

@PrimaryKey 
private long mWorkoutId;