我想要做的是为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。这对我来说最好的方法是什么?
答案 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);