在领域的数据变化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具有不同的值。
在这个屏幕中,调试器中有更多的变量,为了简单起见,我把它们中的大部分留在了我的文章中。
答
这是境界的正确行为。
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;
你应该使用'executeTransaction()',而不是'开始/ commitTransaction()' – EpicPandaForce