Создание свойства LinkingObjects в RealmSwift с использованием многоуровневых свойств

Согласно документации Realm для 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")
}

Предположим, что у нас есть другой класс, называемый 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.

Есть ли другой способ добиться того же эффекта?

1 ответ

Решение

Это может быть достигнуто с помощью фильтра, с оговоркой, что 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 экземпляр находится в и возвращает nil если не назначен одному. Если это так, мы заставляем собственность items вернуть пустой набор Results<Person>,

Другие вопросы по тегам