使用多级属性在 RealmSwift 中创建 LinkingObjects 属性

Creating a LinkingObjects property in RealmSwift by using multiple-level properties

根据 Realm documentation for v0.102.0,这就是创建反向关系的方法:

class Person: Object {
    // ... other property declarations
    let dogs = List<Dog>()
}

狗 (v1)

class Dog: Object {
    // ... other property declarations
    let owners = LinkingObjects(fromType: Person.self, property: "dogs")
}

假设我们有另一个 class,称为 DogFood,并且我们想要创建一个称为 buyers 的反向关系来跟踪 Person 的哪些实例具有 Dog 吃掉 DogFood 的那个实例。我们可以尝试以下方法:

狗 (v2)

class Dog: Object {
    // ... other property declarations
    let favoriteFoods = List<DogFood>
    let owners = LinkingObjects(fromType: Person.self, property: "dogs")
}

狗粮

class DogFood: Object {
    // ... other property declarations
    let buyers = LinkingObjects(fromType: Person.self, property: "dogs.favoriteFoods")
}

但是,这会引发以下错误:Property 'dogs.favoriteFoods' declared as origin of linking objects property 'buyers' does not exist.

还有其他方法可以达到同样的效果吗?

这可以通过过滤器来实现,但需要注意的是,我们需要查询的 DogFood 对象需要是 Realm.

的一部分

代码如下:

class DogFood: Object {
    // ... other property declarations
    var items: Results<Person> {
        if let realm = self.realm {
            return realm.objects(Person).filter(NSPredicate(format: "ANY dogs.favoriteFoods.id == %@", self.id))
        } else {
            return RealmSwift.List<Person>().filter("1 != 1")
        }
    }
}

属性 realm 属于 Realm? 类型,通过继承自 Object 进入画面。它指向特定 Object 实例所在的领域,如果未分配给 returns nil 。如果是这样,我们强制 属性 items 到 return 空集 Results<Person>.