Android RealmResult作为RealmObject字段
我正试图找出用RealmResult作为其字段之一来设置RealmObject的最佳方法 例如,假设我有两个realmobject,Android RealmResult作为RealmObject字段,android,realm,Android,Realm,我正试图找出用RealmResult作为其字段之一来设置RealmObject的最佳方法 例如,假设我有两个realmobject,目标和成就。目标对象包含定义用户想要跟踪的成就查询的字段(例如,成就创建的日期范围、成就类型等),并具有从这些成就中提取统计信息的自定义方法 对于目标来说,什么是包含这些成就的最好方式?以下是我想到的一些方法: 在目标中有一个持久化的RealmList字段,并随时更新该字段,以改变结果查询。但是,如果一项新的成就被添加到该领域,该RealmList将如何更新 在目标
目标
和成就
。目标对象包含定义用户想要跟踪的成就查询的字段(例如,成就创建的日期范围、成就类型等),并具有从这些成就中提取统计信息的自定义方法
对于目标来说,什么是包含这些成就的最好方式?以下是我想到的一些方法:
RealmResult
字段上使用@Ignore
注释。在目标中使用mResult的任何地方,首先检查是否为null,如果需要,重新查询。如果我在getItem()
中使用类似于RecyclerView的东西来重新提取对象,那么我似乎会进行很多不必要的查询RealmResult
as字段的包装类。将侦听器添加到目标,以便在相关字段发生更改时,可以重新查询RealmResult李>
我倾向于使用最后一种方法,认为这是保持有效RealmResult的最干净的方法。我是否错过了一个更简单的方法来实现这一点?好吧,所以我正在尝试实现一个包装器类(我认为它类似于前面提到的DAO抽象@epipandaforce,但我对它不是非常熟悉)
公共类目标说唱者{
私有RealmResults mResults;
私人目标管理;
私人领域;
公共目标说唱者(领域领域、目标){
mRealm=领域;
mGoal=目标;
//TODO:这是否需要在某个地方删除?当GoalRapper获得GC时会发生什么?
target.addChangeListener(新的RealmChangeListener(){
@凌驾
更改后的公共void(realmodel元素){
//重新运行查询
findResultForGoal();
}
});
findResultForGoal();
}
/**
*对给定目标运行查询并计算结果
*/
私有void findResultForGoal(){
mResults=mRealm.where(acquisition.class)
.greaterThanOrEqualTo(“日期”,mGoal.getStartDate())
.lessThanOrEqualTo(“日期”,mGoal.getEndDate())
.equalTo(“类型”,mGoal.getAchievementType())
.findAll();
calculateStats();
}
私有计算属性(){
//从mResult获取相关统计信息。。。
}
}
我还没有测试过这段代码,但我计划有一个带有GoalRapper对象ArrayList的RecyclerView.Adapter
我唯一担心的是,我从未删除mGoal上的侦听器。我甚至需要移除它吗?如果ArrayList被GC'ed,会发生什么情况?我会认为目标字段和附加到它的结果侦听器也会被GC’ed。提醒我,但它在“想法积压”中,所以不会很快发生。谢谢,@EpicPandaForce!你知道实现这一点的最佳方法是什么吗,假设我们不会很快得到@Query?就我个人而言,我可能只会有一个类似于
RealmResults saccessments=aclementdao.findForGoal(realm,goalId)的抽象代码>。。。但那只是我。如果你只在调用realmResults.get(i)
时创建GoalRapper,这意味着在onBindViewHolder()
中,那么你将保留惰性评估,而不必将所有目标保留在一个数组列表中;这是否意味着每次都必须重新运行findResultForGoal,而不是在首次查询目标时只运行一次?calculateStats的实现没有显示出来,但它也必须循环遍历结果中的每一项成果。。。根据元素的数量,调用过多的findAll()
会导致速度减慢。ArrayList也有效,是的。
public class GoalWrapper {
private RealmResults<Achievements> mResults;
private Goal mGoal;
private Realm mRealm;
public GoalWrapper(Realm realm, Goal goal) {
mRealm = realm;
mGoal = goal;
// TODO: does this need to be removed somewhere? What happens when GoalWrapper gets GC'd?
goal.addChangeListener(new RealmChangeListener<RealmModel>() {
@Override
public void onChange(RealmModel element) {
// rerun the query
findResultForGoal();
}
});
findResultForGoal();
}
/**
* Run a query for the given goal and calculate the result
*/
private void findResultForGoal() {
mResults = mRealm.where(Achievement.class)
.greaterThanOrEqualTo("date", mGoal.getStartDate())
.lessThanOrEqualTo("date", mGoal.getEndDate())
.equalTo("type", mGoal.getAchievementType())
.findAll();
calculateStats();
}
private void calculateStats() {
// Get relevant stats from mResult...
}
}