【问题标题】:Realm Android aggregating on child objectRealm Android 聚合子对象
【发布时间】:2017-08-22 15:40:05
【问题描述】:
public class ChallengeDB extends RealmObject {

    @PrimaryKey
    private int challengeId;


    private String targetType;
    private RealmList<ChallengeTargetDB> ChallengeTargetDB;
    private boolean isTargetPerParticipant;
}



  public class ChallengeTargetDB extends RealmObject {
        @PrimaryKey
        private int targetId;
        private String targetName;
        private String description;
        private long targetValue;
        private int targetStep;
        private boolean isPassed;
}

我将这 2 个表链接如下,我需要获取特定挑战 ID 的最大“targetValue”值。

我写的查询如下

RealmResults<ChallengeDB> challengeDBs = realm.where(ChallengeDB.class)
                    .equalTo(WorkoutCashConstants.COLUMN_CHALLENGE_ID, challengeDB.getChallengeId()).findAll();

            long max = challengeDBs.max("ChallengeTargetDB.targetValue").longValue();

我起床结束异常如下

java.lang.IllegalArgumentException: Aggregates on child object fields are not supported: ChallengeTargetDB.targetValue

【问题讨论】:

    标签: android database realm realm-mobile-platform


    【解决方案1】:

    Realm 3.5.0+

    public class ChallengeTargetDB extends RealmObject {
        @PrimaryKey
        private int targetId;
        private String targetName;
        private String description;
        private long targetValue;
        private int targetStep;
        private boolean isPassed;
    
        @LinkingObjects("ChallengeTargetDb")
        private final RealmResults<ChallengeDb> targetOfChallenge = null;
      }
    

    然后

     RealmResults<ChallengeTargetDB> challengeDBs = realm.where(ChallengeTargetDB.class)
                    .equalTo("targetOfChallenge." + WorkoutCashConstants.COLUMN_CHALLENGE_ID, challengeDB.getChallengeId()).findAll();
    
            long max = challengeDBs.max("targetValue").longValue();
    

    【讨论】:

    • 我是否还需要提供链接对象的迁移,如果需要怎么办??
    • @LinkingObjects 不应导致迁移,因为它们实际上不是架构的一部分。
    • 很抱歉这么晚才回复您正在处理其他事情。提高领域的版本和链接对象工作得很好。非常感谢您的帮助。
    【解决方案2】:

    正如例外所说,不支持链接对象字段上的聚合。您需要自己计算。

    试试这个:

    Number max = null;
    for (ChallengeDB item : challengeDBs) {
        if (max == null) {
            max = item.ChallengeTargetDB.max();
        } else {
            Number tmp = item.ChallengeTargetDB.max();
            max = max.longValue() > tmp.longValue() ? max : tmp;
        }
    }
    

    【讨论】:

    • 我已经使用类似的方法获得了最大值。但我的疑问是这可以是一个功能请求吗??
    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2015-07-21
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多