如何在RealmObject setter中解析数据?

时间:2015-03-23 04:45:02

标签: android realm

我想要做的是为RealmOblject子类创建一个自定义setter方法。 Realm不允许我们在getter和setter中使用自定义逻辑,因此唯一可用的选项是变通方法。我知道有两种方法

1)按照Realm文档(http://realm.io/docs/java/0.80.0/)中的说明使用@Ignore。

2)第二种方法是创建一个包含RealmObject的包装类,并且必须实现其所有方法

EG。分数的领域模型

public class Score extends RealmObject
{
    private int score;

    public int getScore()
    {
        return score;
    }

    public void setScore(int score)
    {
        this.score = score;
    }
}

分数包装

public class ScoreWrapper
{
    private Score wrappedScore;
    public int getScore()
    {
        return wrappedScore.getScore();
    }

    public void setScore(int score)
    {
        //can do any custom data parsing here
        wrappedScore.setScore(score+1);
    }

    public RealmObject getRealmObject()
    {
        return wrappedScore;
    }

}

方法1)打破对象封装,所以绝对不会这样做。方法2)似乎是一个很好的妥协。我仍然觉得这是滥用“面向对象”的DBMS。这对我来说最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

来自境界的克里斯蒂安。 getter和setter是Realm当前工作方式的弱点,但允许使用静态方法,因此当前最佳实践需要最少量的代码,如下所示:

public class Score extends RealmObject
{
    ...

    public static void incrementScore(int score, Score score) {
      score.setScore(score + 1);
    }
}

Score obj = new Score();
Score.updateScore(42, obj);

我们正在积极努力解决此问题,因此您可以在此处按照任何进度进行操作:https://github.com/realm/realm-java/issues/909

编辑:从Realm Java 0.88.0开始,你现在可以像使用Realm一样正常使用方法,所以上面的内容可以重写为:

public class Score extends RealmObject {
    private int score;

    public void incrementScore() {
      score = score + 1;
    }
}

Score obj = new Score();
obj.incrementScore();

答案 1 :(得分:0)

请在包装器类中初始化Score类对象。

public class ScoreWrapper
{
    private Score wrappedScore = getRealmObject();

    public int getScore()
    {
        return wrappedScore.getScore();
    }

    public void setScore(int score)
    {
        //can do any custom data parsing here
        wrappedScore.setScore(score+1);
    }

   public RealmObject getRealmObject()
    {
   if(wrappedScore==null)
wrappedScore = new Score();
        return wrappedScore;
    }

}

// ============================================= = //

从另一个类中设置值:

ScoreWrapper wrapper = new  ScoreWrapper ();

wrapper.setScore(scoreValue);