【问题标题】:Filter in realm list swift快速过滤领域列表
【发布时间】:2021-01-20 12:36:23
【问题描述】:
class RetailerModel: BaseResponse {
var customFields = List<CustomFieldsModel>()
}

class CustomFieldsModel: BaseResponse {
@objc dynamic var params : ParamsModel?
}

class ParamsModel: BaseResponse {
var options = List<String>()
}

我正在使用领域来获取数据和 RetailerModel 具有 CustomFieldsModel 对象,CustomFieldsModel 具有 ParamsModelParamsModel 对象包含我要过滤我的 RetailerModel 数据的数组

这是 ParamsModel 包含的 json 数组 “选项”:[“自定义”, “塔”]

我想要的只是具有选项 "custom"

的所有 RetailerModel 的列表

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    这是一个非常具有挑战性的查询,但我想我有一个解决方案。

    然而,首先;领域列表中的原语没有得到很好的支持,并且还不能查询。请参阅herethis 了解更多信息。

    编辑: 10.7 版增加了对过滤器/查询以及基元聚合函数的支持,因此以下信息不再完全有效。但是,这仍然需要注意。

    所以我们需要添加另一个类来保存字符串数据

    class StringClass: Object {
        @objc dynamic var myString = ""
    }
    

    所以下面的类将被更新以匹配

    class ParamsModel: BaseResponse {
        var options = List<StringClass>()
    }
    

    然后,由于对象的深度,我们需要利用子查询来执行查询。

    let predicate = NSPredicate(format: "SUBQUERY(customFields, $customField, ANY $customField.params.options.myString == 'custom').@count > 0")
    let results = realm.objects(RetailerModel.self).filter(predicate)
    

    这将返回其 CustomFieldsModel 具有 ParamsModel 选项列表属性 StringClass myString 属性等于“自定义”的所有零售商模型

    【讨论】:

    • okkk..所以我必须打破我的数组并将其元素存储在 StringClass 中,然后我必须创建一个 StringClass 的新对象,兄弟这看起来很有希望。让我试试,会回复你的。
    • @yawerkhan 很高兴我能帮上忙!需要说明的是,List 对象不是 Array。尽管它们的行为相似,但在引擎盖下它们却截然不同。 List 对象是具有延迟加载对象的 Realm 集合,而 Array 将所有对象加载到内存中。 List 对象在处理大型数据集时非常高效 - 您可以在 List 中填充 100,000 个对象,并且您的应用程序不会出汗。另一方面,在 Array 中加载 100,000 个对象会将所有对象加载到内存中 - 可能会使应用程序崩溃。所以在使用 Realm 时,尽可能坚持使用 Collections,比如 List。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多