如何在 Realm Swift SDK 中通过 ObjectId 设置链接对象属性

问题描述 投票:0回答:1

TLDR:如何通过链接对象的ObjectId设置链接对象属性独立该对象是否已存在于Realm Swift SDK中? (类似于 JS 中的

DBRef

假设有两个 Realm

Object
Dog
Person
,它们具有一对一关系(即每个人可以拥有一只关联的狗)。只需将字段
dog
设置为实际的狗实例即可轻松初始化两个对象然后链接它们:

let realm = try! Realm()
let dog = realm.create(Dog.self)
let person = realm.create(Person.self)
dog.name = "Bello"
person.name = "Mike"
person.dog = dog

我相信这会在领域中创建一个引用,而不是实际上将当前的狗实例复制到人实例中。

如果我已经知道狗实例的ObjectId,我可以初始化一个

Person
实例吗独立狗实例是否已经在领域中或稍后创建?。当稍后读取 person 对象时,如果具有该 ObjectId 的狗尚未添加到领域,我应该得到 nil,但是一旦狗被独立添加到领域,我就会“自动”获取狗。这在 JS 中似乎是可能的,使用
DBRef()
参见这篇 SO 帖子)。 Swift SDK 中是否存在类似 DBRef 的东西?

来自领域文档:

class Person: Object {
    @Persisted var personName: String = ""
    @Persisted var dog: Dog?
}
class Dog: Object {
    @Persisted(primaryKey: true) var objectIdName: ObjectId = ObjectId(string: UUID.uuidString())
    @Persisted var dogName: String = ""
}

我在文档中没有找到任何有关此问题的内容。

swift realm
1个回答
0
投票

简洁地回答这个问题有点困难,因为问题的一种方式是询问对象,另一种方式是询问字符串。让我澄清一下:

Realm 对象可以愉快地存在,没有主键,就像问题中的 Person 对象一样。

(忽略此答案的同步)

在较高的层面上,在 Realm 中,主键与对象的存在、查询对象甚至与对象交互无关。因此,了解对象的“主键”并不会真正影响在对象之间创建关系的能力。

我们有许多项目,其中的对象都具有主键,但该键不会在任何地方一次使用。因此,我们可能需要有关此用例的更多信息。

一般来说,如果没有在对象创建时分配的对象,或者在对象 ID 的情况下,当对象被托管时,您将不会知道该对象的主键。

class Person: Object {
   @Persisted(primaryKey: true) var _id: ObjectId

所以 - 我们在这里给出几个答案:

  1. 不,您不能创建对根本不存在的对象的引用。

  2. 是的,您可以手动将 UUID 字符串添加到人员对象中,该对象可能是未来的 Dog 对象,然后使用该字符串手动创建关系。不建议,但有可能

  3. 是的,您
  4. 可以

    创建对Realm中不存在的对象的引用。给定人和狗

  5. let p = Person() let d = Dog() p.dog = dog
请注意,此时 Realm 中没有持久(存在)的对象 - 它们仅存在于内存中,但人对狗的引用是有效的。

您可以创建对尚不存在的对象的(计算的)引用。

  1. 假设您想要一个没有 List 属性的 Person 对象,但仍然想知道该人有什么狗。我想不出这里的用例,但可以通过 linkingObjects 来完成:
class Person: Object { @Persisted(primaryKey: true) var _id: ObjectId @Persisted(originProperty: "linkedPerson") var linkedDogs: LinkingObjects<Dog> } class Dog: Object { @Persisted(primaryKey: true) var _id: ObjectId @Persisted var linkedPerson: Person! }

然后告诉狗关于他们的人
let p = realm.objects(Person.self).first!

let d0 = Dog()
d0.linkedPerson = p

let d1 = Dog()
d1.linkedPerson = p

try! realm.write {
    realm.add(d0)
    realm.add(d1)
}

注意人没有被修改——我们只给狗添加了一个人。但是,因为 Person 有一个 LinkingObjects,并且更多的狗有该人,所以该人知道这些狗(它本质上是一个计算属性而不是 List 对象)。
所以这里的重点是不要通过字符串关联对象,而是使用对象本身 - 它更加灵活

© www.soinside.com 2019 - 2024. All rights reserved.