将新Object添加到Realm中的现有List

时间:2016-07-20 20:01:23

标签: ios swift realm realm-list

我有两节课。首先看起来像这样:

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

和第二类看起来像这样:

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

现在位于'viewDidLoad'的ViewController中我创建了空Person的对象List并将其保存在Realm中

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以及如何更新人员[0]? 我使用SWIFT 3.0

4 个答案:

答案 0 :(得分:9)

persons属性的类型为Results<Person>,它是一个包含由Realm管理的Person个对象的集合。为了修改托管对象的属性,例如将新元素附加到列表属性,您需要在写入事务中。

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

答案 1 :(得分:2)

写下这样的东西:

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

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

请检查您是如何获得realm的。每次拨打defaultRealm时,您都会获得新的境界。

答案 2 :(得分:1)

附注:除了在写入事务中添加代码来解决您的问题之外,您还可以按名称查询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)
    }
}

答案 3 :(得分:0)

为领域数据库添加对象

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)
        }



    }
相关问题