Добавление нового объекта в существующий список в Realm

У меня два класса. Сначала выглядит так:

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

и второй класс, который выглядит так:

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

и теперь в ViewController в 'viewDidLoad' я создаю объект 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]? Я использую СВИФТ 3.0


person PiterPan    schedule 20.07.2016    source источник


Ответы (4)


Свойство persons имеет тип Results<Person>, представляющий собой коллекцию, содержащую Person объектов, которыми управляет Realm. Чтобы изменить свойство управляемого объекта, например добавить новый элемент в свойство списка, необходимо находиться в транзакции записи.

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

Напишите что-то вроде этого:

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

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

Пожалуйста, проверьте, как вы получаете realm. Каждый раз, когда вы звоните defaultRealm, вы получаете новое царство.

person Flipper    schedule 20.07.2016

Боковое примечание. Помимо добавления кода внутри транзакции записи, который решает вашу проблему, вы можете запросить 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)
    }
}
person fs_tigre    schedule 27.04.2017

Добавить объект для базы данных Realm

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



    }
person Srinivasan_iOS    schedule 07.03.2019