首页 > 解决方案 > 领域:在列表属性包含特定元素的条件下进行查询

问题描述

我有一个包含一组article对象的领域数据库。这些文章对象中的每一个都包含一个ValidityTimeFrame包含两个日期对象的对象列表。顾名思义,这些状态表明该项目在哪些时间间隔内有效。

class Article(
    var validDates : List<ValidityTimeFrame>
)

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

我现在想从数据库中查询所有文章,其中一篇validDates声明该项目有效,例如今天的日期介于validFrom和之间validUntil

标签: androidkotlinrealm

解决方案


您希望以下内容起作用,但它会查询以下内容:

获取有效日期至少包含一篇文章,其中提供的日期大于或等于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>在整个表格发生变化时对此进行评估,以确保您保持同步。

不过,请确认我没有误导您。


推荐阅读