Область: Запрос при условии, что свойство списка содержит определенный элемент - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть база данных областей, содержащая набор article объектов. Каждый из этих объектов статьи содержит список ValidityTimeFrame объектов, содержащих два объекта даты. Как следует из названия, это состояние, в котором временные интервалы элемента действительны.

class Article(
    var validDates : List<ValidityTimeFrame>
)

class ValidityTimeFrame(
    var validFrom: Date = Date(),
    var validUntil: Date = Date()
)

Теперь я хочу запросить все статьи из базы данных, где одна из этих validDates утверждает, что элемент действителен, например, сегодняшняя дата находится между validFrom и validUntil.

1 Ответ

0 голосов
/ 03 сентября 2018

Можно ожидать, что сработает следующее, но оно запросит следующее:

Получите статьи, где действительные даты содержат хотя бы одну, где указанная дата больше или равна validFrom, И есть хотя бы одну, где указанная дата меньше validTo

Таким образом, это не работает (например, с датой [09.11-09.13], а затем [09.17-09.19], оно фактически все равно вернет элемент, если вы в данный момент находитесь на 09.15)

val date = Calendar.getInstance().getTime()
val articles = realm.where<Article>()
                    .beginGroup()
                    .greaterThanOrEqualTo("validDates.validFrom", date)
                    .lessThan("validDates.validTo", date)
                    .endGroup()
                    .findAll()

Однако даже без поддержки подзапроса вы можете обойти это, если инвертировать запрос через связывающие объекты:

class Article(
    var validDates : RealmList<ValidityTimeFrame>
)

class ValidityTimeFrame(
    var validFrom: Date = Date(),
    var validUntil: Date = Date()

    @LinkingObjects("validDates")
    val articles: RealmResults<Article>? = null

)

Потому что теперь вы можете сделать

val articles = realm.where<ValidityTimeFrame>()
                    .greaterThanOrEqualTo("validFrom", date)
                    .lessThan("validTo", date)
                    .findAll()
                    .flatMap { it.articles!! }
                    .distinct() // assumes `equals` by primary key of Article

Хотя вам все еще нужно убедиться, что вы оцениваете это, когда RealmResults<Article> по всей таблице изменяется, чтобы обеспечить синхронизацию.

Пожалуйста, убедитесь, что я вас не вводю в заблуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...