私には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
を作成できます。問題は、SecondViewController
のViewDidLoad
でこのデータを読み取ろうとすると始まります。
var persons: Results<Person>?
func viewDidLoad(){
persons = try! realm.allObjects()
}
そして、新しいDog
をList
に追加して、ボタンアクションでそれを実行してみてください。
@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
に追加するにはどうすればよいですか?また、person [0]を更新するにはどうすればよいですか?私はSwift 3.0
persons
プロパティのタイプはResults<Person>
、これはレルムによって管理されるPerson
オブジェクトを含むコレクションです。リストプロパティに新しい要素を追加するなど、管理対象オブジェクトのプロパティを変更するには、書き込みトランザクション内にいる必要があります。
try! realm.write {
persons[0].dogs.append(newDog)
}
このようなものを書いてください:
if let person = persons?[0] {
person.dogs.append(newDog)
}
try! realm.write {
realm.add(person, update: true)
}
realm
をどのように取得しているかを確認してください。 defaultRealm
を呼び出すたびに、新しいレルムを取得します。
補足:問題を解決する書き込みトランザクション内にコードを追加する以外に、次のように名前で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)
}
}
レルムデータベースのオブジェクトを追加します
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)
}
}