如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?
Posted
技术标签:
【中文标题】如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?【英文标题】:How to set NSPredicate in Realm to find totalPrice > X? 【发布时间】:2021-11-26 13:49:06 【问题描述】:这是一个领域模型:
final class OrderObject: Object
@Persisted var items: List<OrderItemObject>
final class OrderItemObject: EmbeddedObject
@Persisted var price: Decimal128
@Persisted var count: Int
我怎样才能找到总价格(价格 * 数量)> 比某个数字,例如 50?在 OrderObject 中使用 NSPredicate
【问题讨论】:
这个问题有点不清楚。您是在问如何获取items
列表中包含的单个项目或该列表中的一系列项目的总数? total items 是令人困惑的部分,items 是复数。 NSPredicate 又是如何发挥作用的?您是否也尝试过滤列表?你能澄清一下这个问题吗?
@Jay 我只需要给出某种谓词就可以让 OrderObject 的商品超过 50 美元(示例),要得到它我必须将 OrderItemObject 的价格乘以计数有没有其他方法可以找到它除了 NSPredicate 吗?
这是否回答了您的问题:ios Realm Filter objects in a list of a relationship?
【参考方案1】:
有多种过滤列表的方法,但最重要的是,您不能在领域过滤器中对计算属性执行数学运算(它不是持久化的)。这意味着要使用过滤器,数据必须存在于 Realm 中。
一种选择是使用计算属性支持变量。这种技术会将价格、计数和总值存储在领域中,但您的应用程序通过计算变量与对象交互,计算变量会随着这些变量的变化而更新这些变量。
这是一个新的 OrderItemObject 模型
class OrderItemObject: EmbeddedObject
@objc private dynamic var _price: Decimal128 = 0.0
@objc private dynamic var _count: Int = 0
@objc private dynamic var _total: Decimal128 = 0.0
var price: Decimal128
get
return self._price
set
_price = newValue
self._total = newValue * Decimal128(value: self._count)
var count: Int
get
return self._count
set
self._count = newValue
self._total = Decimal128(value: newValue) * self._price
var total: Decimal128
get
return self._total
_price 和 _count 是私有的,因此无法从模型外部访问它们以及 _total。使用此配置,如果您的应用更改价格或数量,它会更新支持的 _total var。
那么过滤就超级简单了
let items = order.items.filter("_total > 50")
还有许多其他选项。
请记住,如果您要更新现有的持久对象,则此解决方案需要包含 realm.write。
【讨论】:
以上是关于如何在 Realm 中设置 NSPredicate 以找到 totalPrice > X?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NSPredicate 中重现 MATCHES 以查询 Realm?