web-dev-qa-db-ja.com

レルムの既存のリストに新しいオブジェクトを追加する

私には2つのクラスがあります。最初は次のようになります。

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

そしてそのように見える2番目のクラス:

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

そして今、 'viewDidLoad'のViewControllerに空のPersonでオブジェクトListを作成し、それをレルムに保存します

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

それはうまく機能し、Personを作成できます。問題は、SecondViewControllerViewDidLoadでこのデータを読み取ろうとすると始まります。

var persons: Results<Person>?

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

そして、新しいDogListに追加して、ボタンアクションでそれを実行してみてください。

@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.新しいDogListに追加するにはどうすればよいですか?また、person [0]を更新するにはどうすればよいですか?私はSwift 3.0

10
PiterPan

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

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

このようなものを書いてください:

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

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

realmをどのように取得しているかを確認してください。 defaultRealmを呼び出すたびに、新しいレルムを取得します。

2
Flipper

補足:問題を解決する書き込みトランザクション内にコードを追加する以外に、次のように名前で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)
    }
}
1
fs_tigre

レルムデータベースのオブジェクトを追加します

class Task : Object {
    @objc dynamic var id : Int = 0
    @objc dynamic var name = ""
    @objc dynamic var phone = ""
    @objc dynamic var address = ""
}
@IBAction func buttonSave(_ sender: Any) {
        let realm  = try! Realm()
        let user = Task()
        user.id = 0
        user.name = (txtName.text! as NSString) as String
        user.phone = (txtPhone.text! as NSString) as String
        user.address = (txtAddress.text! as NSString) as String
        try! realm.write {
            realm.add(user)
            print("user:",user.name)
        }



    }
0
CSE 1994