【问题标题】:Understanding LinkingObjects in Realm Xcode 12, Also when to use it了解 Realm Xcode 12 中的 LinkingObjects,以及何时使用它
【发布时间】:2021-06-12 15:32:55
【问题描述】:

在 Realm 中,我在理解 LinkingObjects 的实现时遇到了问题(我在 Realm T,T 中是新手),假设一个人可能有多个 Dog(Dog 列表),所以我会编写如下代码:

Person : Object {
   dynamic var name:String = ""
   let dogs = List<Dog>() 
}

Dog : Object {
   dynamic var name: String = ""
   let walkers = LinkingObjects<fromType: Person.self, property:"dogs"> 
}

让我们说

Person A
dogs = [Alex,Cindy]

Person B
dogs = [Doggo,Kiba]

如果我使用 Realm.delete 删除 Alex,那么它会变成 Person A dogs = [Cindy] 这很简单。

但是当我从类中删除 LinkingObjects 时,如下所示:

 Person : Object {
   dynamic var name:String = ""
   let dogs = List<Dog>() 
}

Dog : Object {
   dynamic var name: String = ""
}

应用程序仍然可以正常运行,没有任何差异,我仍然可以添加 Person 3 并附加 Dog 列表。同样,在删除( Realm.delete )时,与将 LinkingObject 添加到 Dog 类时没有区别。这里有什么区别?什么时候可以使用 LinkinObject?谁能解释一下?还是写一些更容易理解的代码?

已经阅读了所有先前的答案,但我仍然需要另一个解释。非常感谢!!

【问题讨论】:

    标签: swift database xcode realm linkingobjects


    【解决方案1】:

    您几乎可以将 LinkingObjects 视为一个计算属性 - 当子对象添加到父对象列表时,它会自动创建到父对象的反向链接。

    因此,当将 Dog 添加到某人的狗列表中时,会将人员引用添加到 Dog 的 walkers 列表中。请记住,如果 A 人添加 Doggo,B 人添加 Doggo,从技术上讲这是多对多关系,Doggo 的反向关系“walkers”将包含人 A 和人 B

    应用程序仍然可以正常运行,没有任何差异

    这是真的,它不会影响应用程序的运行。但是不同之处在于,通过删除 walkers LinkingObjects,无法查询 Dogs 的 Person 并获得 Dog 结果(即,您无法将关系图遍历回 person)

    换句话说,我们可以向 Person 查询各种狗的东西

    let results = realm.objects(Person.self).filter("ANY dogs.color == 'brown'")
    

    返回结果对象包含有一只棕色狗的人。但是,我们不知道他们养的哪只狗是棕色的;可以是一,也可以是三。

    但是,假设您想要获得一个包含特定棕色狗的结果对象,并且想要每个狗的所有者名称 - 如果没有反向关系 (LinkingObjects),您将无法真正做到这一点

    let dogResult = realm.object(Dog.self).filter("color == 'brown'")
    for dog in dogResult {
       let person = dog.walkers.first!.name //assume there is only one owner
       print(person.name)
    }
    

    dogResults 将只包含棕色的狗,并且您具体知道它们是哪些。

    所以这是一个很大的区别;如果没有 LinkingObjects,我们依赖于返回 Person 对象,然后迭代或处理每个对象以获取我们想要的数据。使用 LinkingObjects,我们可以明确地获取我们想要使用的对象。

    当您想在结果中添加观察者以观察变化(例如棕色狗)以收到变化通知时,它非常方便。

    【讨论】:

    • 最后的代码解释了很多!!!!现在我知道如何使用 LinkingObject。你是一个救生员,想到这个我的大脑很痛......非常感谢你!
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多