【问题标题】:How to parse data in RealmObject setters?如何解析 RealmObject 设置器中的数据?
【发布时间】:2015-03-23 04:45:01
【问题描述】:

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

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

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

例如。 Score 的领域模型

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 的滥用。对我来说最好的方法是什么?

【问题讨论】:

    标签: android realm


    【解决方案1】:

    来自Realm的Christian。 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();
    

    【讨论】:

    • 谢谢克里斯蒂安。看起来就像用 C 语言进行 OO 编程,结构又重新开始了。我试过这个,但我发现代码有点乱。无论如何,一旦我的项目完成,我会跟进。希望到那时 Relam 可以完全支持 getter 和 setter ;)
    【解决方案2】:

    请在您的包装类中初始化 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      相关资源
      最近更新 更多