Realm Android агрегирует на дочернем объекте

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 таблицы, связанные следующим образом, и мне нужно получить максимальное значение "targetValue" конкретного challengeId.

Запрос, для которого я написал, выглядит следующим образом

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

2 ответа

С 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();

Как говорит исключение, агрегаты в поле связанного объекта не поддерживаются. Вы должны вычислить это самостоятельно.

Попробуй это:

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;
    }
}
Другие вопросы по тегам