Android RealmResult作为RealmObject字段

Android RealmResult作为RealmObject字段,android,realm,Android,Realm,我正试图找出用RealmResult作为其字段之一来设置RealmObject的最佳方法 例如,假设我有两个realmobject,目标和成就。目标对象包含定义用户想要跟踪的成就查询的字段(例如,成就创建的日期范围、成就类型等),并具有从这些成就中提取统计信息的自定义方法 对于目标来说,什么是包含这些成就的最好方式?以下是我想到的一些方法: 在目标中有一个持久化的RealmList字段,并随时更新该字段,以改变结果查询。但是,如果一项新的成就被添加到该领域,该RealmList将如何更新 在目标

我正试图找出用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...
        }
    }