了解 LinkingObjects in Realm Xcode 12,以及何时使用它
Understanding LinkingObjects in Realm Xcode 12, Also when to use it
在 Realm 中,我在理解(我是 Realm T,T 中的新手)LinkingObjects 的实现时遇到了问题,假设一个 Person 可能有不止一只 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]
这很简单。
但是当我从 class 中删除 LinkingObjects 时,如下所示:
Person : Object {
dynamic var name:String = ""
let dogs = List<Dog>()
}
Dog : Object {
dynamic var name: String = ""
}
应用程序仍然可以 运行 正常,没有任何差异,我仍然可以添加 Person 3 并附加 Dog 列表。此外,在删除 (Realm.delete) 时,与将 LinkingObject 添加到 Dog class 时没有区别。这里有什么区别?我什么时候可以使用 LinkinObject?谁能解释一下?或者写一些更容易理解的代码?
已经阅读了之前的所有答案,但我仍然需要另一个解释。非常感谢!!
您几乎可以将 LinkingObjects 视为一个计算 属性 - 当子对象添加到父对象列表时,它会自动创建一个与父对象相反的 link。
所以当一条狗被添加到一个人的狗列表中时,一个人的参考被添加到狗的步行者列表中。请记住,这是一个多对多的关系,所以从技术上讲,如果 A 添加 Doggo,B 添加 Doggo,则 Doggo 的反向关系 'walkers' 将包含 A 和 B
the app still can run normally without any diff
是的,不影响应用程序的运行。然而,不同之处在于,通过删除步行者 LinkingObjects,无法查询 Dogs 的 Person 并获得 Dog 结果(即您无法将关系图遍历回 person )
换句话说,我们可以向 Person 查询各种狗东西
let results = realm.objects(Person.self).filter("ANY dogs.color == 'brown'")
其中 returns 结果对象包含 Persons that have a brown dog。但是,我们不知道他们养的哪只狗是棕色的;可以是一个,也可以是三个。
但是,假设您想要获得一个包含特定棕色狗的结果对象,并且想要每只狗的所有者姓名 - 如果没有反向关系 (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 我们可以专门获取我们想要使用的对象。
当你想在结果中添加一个观察者来观察变化时——比如在棕色狗身上——接收变化通知时,它非常方便。
在 Realm 中,我在理解(我是 Realm T,T 中的新手)LinkingObjects 的实现时遇到了问题,假设一个 Person 可能有不止一只 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]
这很简单。
但是当我从 class 中删除 LinkingObjects 时,如下所示:
Person : Object {
dynamic var name:String = ""
let dogs = List<Dog>()
}
Dog : Object {
dynamic var name: String = ""
}
应用程序仍然可以 运行 正常,没有任何差异,我仍然可以添加 Person 3 并附加 Dog 列表。此外,在删除 (Realm.delete) 时,与将 LinkingObject 添加到 Dog class 时没有区别。这里有什么区别?我什么时候可以使用 LinkinObject?谁能解释一下?或者写一些更容易理解的代码?
已经阅读了之前的所有答案,但我仍然需要另一个解释。非常感谢!!
您几乎可以将 LinkingObjects 视为一个计算 属性 - 当子对象添加到父对象列表时,它会自动创建一个与父对象相反的 link。
所以当一条狗被添加到一个人的狗列表中时,一个人的参考被添加到狗的步行者列表中。请记住,这是一个多对多的关系,所以从技术上讲,如果 A 添加 Doggo,B 添加 Doggo,则 Doggo 的反向关系 'walkers' 将包含 A 和 B
the app still can run normally without any diff
是的,不影响应用程序的运行。然而,不同之处在于,通过删除步行者 LinkingObjects,无法查询 Dogs 的 Person 并获得 Dog 结果(即您无法将关系图遍历回 person )
换句话说,我们可以向 Person 查询各种狗东西
let results = realm.objects(Person.self).filter("ANY dogs.color == 'brown'")
其中 returns 结果对象包含 Persons that have a brown dog。但是,我们不知道他们养的哪只狗是棕色的;可以是一个,也可以是三个。
但是,假设您想要获得一个包含特定棕色狗的结果对象,并且想要每只狗的所有者姓名 - 如果没有反向关系 (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 我们可以专门获取我们想要使用的对象。
当你想在结果中添加一个观察者来观察变化时——比如在棕色狗身上——接收变化通知时,它非常方便。