在领域的数据变化android

问题描述:

在我的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

这是境界的正确行为。

Realm在编译时生成继承自Workout的代理对象。并且从/向Realm读取/写入数据实际上是由代理对象通过重写getter/setter来实现的。 Real的原始对象的成员字段不会被更改。

Realm.createObject()被调用时,它确实会返回一个代理对象,其成员字段不符合您的预期。

您仍然可以通过调用Workout w = new Workout()来创建原始模型对象的一个​​实例,我们称其为独立对象(意味着它不由领域管理)。这就像普通的Java对象一样。您还可以通过致电w = realm.copyToRealmOrUpdate(w)将其复制到Realm。请注意,我们将w的值更改为返回值。该函数将返回一个由Realm现在管理的Proxy对象。

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;