Swift 中 Realm 查询的交叉引用谓词

Posted

技术标签:

【中文标题】Swift 中 Realm 查询的交叉引用谓词【英文标题】:Cross-referencing predicate for Realm queries in Swift 【发布时间】:2016-12-04 07:56:16 【问题描述】:

所以我最近一直在学习 Swift 中的 Realm,我遇到了一个关于数据模型之间潜在通知的设计问题。如果有人愿意提供一些见解,将不胜感激。

// Class A is what users mainly interact with
Class A: Object 
    dynamic var propertyA = ""
    dynamic var propertyB = ""
    dynamic var propertyC = ""

    override static func primaryKey() -> String? 
        return "propertyA"
    


// Class B is what the server interacts with, like data feeding
Class B: Object 
    dynamic var propertyA = ""
    dynamic var propertyX = ""
    dynamic var propertyY = ""
    dynamic var propertyZ = ""

    override static func primaryKey() -> String? 
        return "propertyA"
    

我在控制器内部为Object A 设置了一个通知块。因此,每当resultObjectsA 发生更改时,都会触发通知块。

let resultObjectsA = realm.objects(A).filter('predicate1')
let notificationTokenA = resultObjectsA.addNotificationBlock 
    ...

在我正在构建的应用程序中,用户可以选择一组Object A,应用程序会从服务器查询选择集的状态。返回结果将存储/呈现在Object B。现在,我需要为Object B 编写一个查询/谓词:

let resultObjectsB = realm.objects(B).filter('predicate2')

这样resultObjectB 条目中的propertyA 可以在resultObjectsA 条目中的propertyA 中找到,就像一对一映射一样。

我不确定这样的谓词是否可行。如果还有其他方法可以实现我想在这里做的事情,我也非常渴望学习。

【问题讨论】:

【参考方案1】:

查询所有(实际上应该有一个对象,因为主键)对象B where objectB.propertyA == objectA.propertyA 使用:

let resultObjectsB = realm.objects(B).filter('propertyA = %@', objectA.propertyA)

另一种选择是使用 AB 之间的一对一关系,在 https://realm.io/docs/swift/latest/#to-one-relationships 了解更多信息

【讨论】:

以上是关于Swift 中 Realm 查询的交叉引用谓词的主要内容,如果未能解决你的问题,请参考以下文章

具有多个条件和一个参数的谓词

在 SWIFT 的谓词中使用“timeIntervalSinceNow”

如何在 Swift 中使用“IN”谓词进行 ckQuery?

领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?

swift CoreData 谓词

Swift / Cloudkit 谓词格式