2017-01-07 6 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은 조회 메커니즘이며 실제로 디스크에 저장된 저장소가 아닙니다. 따라서 쓰기 트랜잭션을 통해 데이터를 삽입 할 수 없습니다. 당신이 당신의 스키마를 재 설계하는 경우

그러나, 그래서 Person는 동일한 사전에 PersonDog 삽입 코드가 작동합니다 자체가 부모를 결정하기 위해 LinkingObjects을 정의하는 ListDog의 객체를 가지고 있으며, 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) 
    } 
} 

몇 가지 더 쉬운 방법이 있기를 바랍니다.