使用多级属性在 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>
.
根据 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>
.