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