领域:在list属性包含特定元素的条件下进行查询

时间:2018-09-03 15:07:56

标签: android kotlin realm

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

class Article(
    var validDates : List<ValidityTimeFrame>
)

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

我现在要从数据库中查询所有文章,其中validDates之一表明该项目有效,例如今天的日期在validFromvalidUntil之间。

1 个答案:

答案 0 :(得分:2)

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

  

获取文章,其中有效日期至少包含一个提供日期大于或等于validFrom的日期,并且至少包含一个提供日期小于validTo的日期

因此,此无效(例如,日期为[09.11-09.13],然后是[09.17-09.19],如果您当前使用的是09.15,则实际上仍会返回该项目)< / p>

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>发生变化时对此进行评估,以确保保持同步。

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