2017-01-07 2 views
0

辞書を使用した作成のためのRealm inverse-relationshipsサポートを実装したいと思います。レルム値の作成のための領域逆関係のサポート

しかし、アサーションは失敗します。辞書からの犬は作成されませんでした。

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は検索メカニズムであり、ディスク上のストアの実際の表現ではありません。したがって、書き込みトランザクションを介してデータを挿入することはできません。

しかし、あなたのスキーマを再設計ならば、そうPersonListDogのオブジェクトを持っており、Dog自体は同じ辞書でPersonDogを挿入するあなたのコードは動作するはずです、その親を決定するためにLinkingObjectsを定義します。 :)

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) 
    } 
} 

私はいくつかの簡単な方法があると思います。

関連する問題