2016-07-20 30 views
4

私は2つのクラスを持っています。まず、以下のようになります。そのように見えますレルムの既存のリストに新しいオブジェクトを追加する

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

及び第二のクラス:ViewControllerで今

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

と私は空のListでオブジェクトPersonを作成し、レルムに保存「のviewDidLoad」で

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

それはうまく動作し、Personを作成することができます。01でこのデータを読み取ろうとすると問題が発生します。 ViewDidLoadでそれをやって:

var persons: Results<Person>? 

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

とボタンアクションでそれをやってListに新しいDogを追加しよう:

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

    persons[0].dogs.append(newDog) 

    // in this place my application crashed 

} 

ここに私のアプリは、情報をクラッシュさ:Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first.どのように新しいDogを追加することができますListに、どのように人[0]を更新できますか? 私はこのようなSWIFT 3.0

答えて

7

personsプロパティはResults<Person>です。これは、レルムによって管理されるPersonオブジェクトを含むコレクションです。新しい要素をリストプロパティに追加するなど、管理対象オブジェクトのプロパティを変更するには、書き込みトランザクション内にいる必要があります。

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

書き込みに何かを使用します。

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

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

あなたがrealmを取得しているか確認してください。 defaultRealmに電話するたびに、新しい領域が広がります。

0

側注:あなたの問題を解決書き込みトランザクション内のコードを追加するだけでなく、あなたが続くとして名前でPersonを問い合わせることができ...

@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) 
    } 
} 
関連する問題