如何在 Realm 中设置 NSPredicate 以查找 X >的总价格?



这里是一个领域模型:

final class OrderObject: Object {
@Persisted var items: List<OrderItemObject>
}

final class OrderItemObject: EmbeddedObject {
@Persisted var price: Decimal128
@Persisted var count: Int
}

如何查找商品总价(price * count)>比某个数字,比如50?使用NSPredicate OrderObject

有许多方法可以过滤列表,但最重要的是,您不能在计算属性的领域过滤器中执行数学运算(它不是持久化的)。这意味着要使用过滤器,数据必须存在于Realm中。

一个选项是使用计算属性支持变量。这种技术将在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变量。

那么过滤器就超级简单了

let items = order.items.filter("_total > 50")

还有许多其他选项。

请记住,此解决方案需要合并一个领域。如果您正在更新一个现有的持久化对象,请写入

相关内容

最新更新