android - 领域:在列表属性包含特定元素的条件下进行查询
问题描述
我有一个包含一组article
对象的领域数据库。这些文章对象中的每一个都包含一个ValidityTimeFrame
包含两个日期对象的对象列表。顾名思义,这些状态表明该项目在哪些时间间隔内有效。
class Article(
var validDates : List<ValidityTimeFrame>
)
class ValidityTimeFrame(
var validFrom: Date = Date(),
var validUntil: Date = Date()
)
我现在想从数据库中查询所有文章,其中一篇validDates
声明该项目有效,例如今天的日期介于validFrom
和之间validUntil
。
解决方案
您希望以下内容起作用,但它会查询以下内容:
获取有效日期至少包含一篇文章,其中提供的日期大于或等于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>
在整个表格发生变化时对此进行评估,以确保您保持同步。
不过,请确认我没有误导您。
推荐阅读
- node.js - oAuth 2.0 access token validation node.js
- c# - 不区分大小写的 List.Contains():方法“包含”没有重载需要 2 个参数
- django - 获取属性错误:模块'matplotlib.pyplot'没有属性'canvas'
- javascript - GraphQL:在文件上传期间解决承诺时出错
- c# - 覆盖/更新文件夹中的现有图像文件
- javascript - 如何在mysql数据库中插入我的代码JS
- java - 为什么当 tabAt[i] 不为空时 ConcurrentHashMap 不使用“CAS”但使用“同步”
- java - Firebase UI RecyclerView
- c++ - 将 Doctest 与代码一起使用时将实现放在哪里
- robotframework - 使用 Robot Framework 的执行级别设置和拆卸