2016-07-20 50 views
4

Ich habe zwei Klassen. Zunächst sieht wie folgt aus:Hinzufügen eines neuen Objekts zu einer bestehenden Liste in Realm

class Person: Object { 
    dynamic var owner: String? 
    var dogs: List<Dogs>() 
} 

und zweite Klasse, die so aussieht:

class Dogs: Object { 
    dynamic var name: String? 
    dynamic var age: String? 
} 

und jetzt in ViewController in 'viewDidLoad' erstelle ich Objekt Person mit leeren List und speichern Sie es in Realm

func viewDidLoad(){ 
    let person = Person() 
    person.name = "Tomas" 
    try! realm.write { 
     realm.add(Person.self) 
    } 
} 

es funktioniert gut und ich kann erstellen Person, Problem beginnt, wenn ich versuche, diese Daten in 01 zu lesenin ViewDidLoad tut es:

var persons: Results<Person>? 

func viewDidLoad(){ 
    persons = try! realm.allObjects() 
} 

und versucht, neue in Schaltfläche Aktion hinzufügen Dog zu List tun:

@IBAction func addDog(){ 
    let newDog = Dogs() 
    newDog.name = "Rex" 
    newDog.age = "2" 

    persons[0].dogs.append(newDog) 

    // in this place my application crashed 

} 

Hier ist mein App mit Informationen abstürzt: Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first. Wie kann ich neue hinzufügen Dog zu List und wie kann ich Person [0] aktualisieren? Ich benutze SWIFT 3.0

Antwort

7

Die persons Eigenschaft ist vom Typ Results<Person>, die eine Sammlung Person Objekte enthält, die von einem Realm verwaltet werden. Um eine Eigenschaft eines verwalteten Objekts zu ändern, z. B. ein neues Element an eine Listeneigenschaft anhängen, müssen Sie sich innerhalb einer Schreibtransaktion befinden.

try! realm.write { 
    persons[0].dogs.append(newDog) 
} 
2

schreiben etwas wie folgt aus:

if let person = persons?[0] { 
    person.dogs.append(newDog) 
} 

try! realm.write { 
    realm.add(person, update: true) 
} 

Bitte überprüfen Sie, wie Sie realm bekommen. Jedes Mal, wenn Sie defaultRealm anrufen, erhalten Sie ein neues Realm.

0

Side Hinweis: Neben den Code innerhalb der Schreibtransaktion das Hinzufügen, die das Problem löst, könnten Sie Person namentlich Abfrage wie folgt ...

@IBAction func addDog(){ 
    let newDog = Dogs() 
    newDog.name = "Rex" 
    newDog.age = "2" 

    let personName = realm.objects(Person.self).filter("name = 'Tomas'").first! 

    try! realm.write { 
     personName.dogs.append(newDog) 
    } 
} 
Verwandte Themen