这里是一个领域模型:
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")
还有许多其他选项。
请记住,此解决方案需要合并一个领域。如果您正在更新一个现有的持久化对象,请写入