2017-01-07 8 views
0

Я хотел бы реализовать Realm inverse-relationships поддержку для создания со словарем.Поддержка обратного отношения Realm для создания со значением словаря

Но утверждение не выполнено: собака из словаря не была создана.

import RealmSwift 

class Dog: Object { 
    dynamic var name: String? 
    dynamic var owner: Person? 
} 

class Person: Object { 
    dynamic var name: String? 
    let dogs = LinkingObjects(fromType: Dog.self, property: "owner") 
} 

func sample() -> Person? { 
    // Get the default Realm 
    let realm = try? Realm() 

    let sampleValue: [String: Any] = ["name": "Harry", "dogs": [["name": "Belle"]]] 
    var person: Person? = nil 
    try? realm?.write { 
     person = realm?.create(Person.self, value: sampleValue, update: false) 
    } 

    assert(person?.dogs.isEmpty == false) 

    return person 
} 

Примечание: RealmSwift (2.1.2)

ответ

1

LinkingObjects - это механизм поиска, а не фактическое представление хранилища на диске. Таким образом, невозможно вставить в нее данные с помощью транзакции записи.

Однако, если вы перепроектировать схему, так Person имеет List из Dog объектов и Dog сам определяет LinkingObjects для определения его родителей, то ваш код вставки Person и Dog в том же словаре должен работать.)

class Dog: Object { 
    dynamic var name: String? 
    let owners = LinkingObjects(fromType: Person.self, property: "dogs") 
} 

class Person: Object { 
    dynamic var name: String? 
    let dogs = List<Dog>() 
} 
0

Обход я нашел, чтобы создать каждый объект отдельно.

try? realm.write { 
    person = realm.create(Person.self, value: sampleValue, update: false) 
    let dogsValue = sampleValue["dogs"] as? [[String: Any]] 
    dogsValue?.forEach { 
     var dogValue = $0 
     dogValue["owner"] = person 
     realm.create(Dog.self, value: dogValue, update: false) 
    } 
} 

Надеюсь, есть несколько более простых способов.