【问题标题】:Data change in realm android领域android中的数据更改
【发布时间】:2015-07-21 20:52:23
【问题描述】:

在我的 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的截图。

此屏幕中的调试器中有更多变量,为了简单起见,我在帖子中省略了大部分变量。

【问题讨论】:

  • 你应该使用executeTransaction()而不是begin/commitTransaction()

标签: android realm


【解决方案1】:

这是 Realm 的正确行为。

Realm 在编译时生成 Proxy 对象,该对象继承自您的 Workout。从/向 Realm 读取/写入数据实际上是由代理对象通过覆盖 getter/setter 实现的。 Realm 不会更改原始 Object 的成员字段。

Realm.createObject() 被调用时,它确实返回了一个代理对象,它的成员字段不是你所期望的。

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

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多