如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift for Realm 模型中设置主键

在 Swift 中设置 Realm 的位置

如何在 NSPredicate 中重现 MATCHES 以查询 Realm?

使用 Realm 和 NSPredicate 按数组索引排序

使用 Swift 过滤 Realm 对象

如何将 @FetchRequest 属性包装器的新 nsPredicate 动态属性与传递给 View 的对象一起使用