Работа с областью и результатом JSON



Я новичок в области, и я пытаюсь использовать царстве в моем проекте. Здесь я пытаюсь разобрать JSON и сохранить его с помощью realm. Когда я пытаюсь выполнить цикл через результирующий массив, возникает ошибка

'попытка изменить объект вне транзакции записи-сначала вызовите beginwritetransaction на экземпляре RLMRealm'

Это результат JSON:

{"data":[{"id":1,"parent_id":0,"name":"JenniferMaenle","title":"Ms","phone":"","address":"Toled, ohio","email":"jlmaenle@aol.com","image":"44381525_2017.jpg","relation_id":5,"created_at":null,"updated_at":"2017-08-10 02:30:05"},{"id":2, "parent_id":1,"name":"Khadeeja","title":"","phone":"","address":"","email":"","image":"Khadeeja_2017-07-17.jpg","relation_id":2,"created_at":null,"updated_at":"2017-07-17 08:3:12"}]}

Я пытаюсь разобрать JSON и сохранить его в базе данных Realm. Вот моя попытка:

class Person: Object {

dynamic var name = ""
dynamic var title = ""
dynamic var address = ""

}

override func viewDidLoad() {
    super.viewDidLoad()
    self.add()

}

func add(){

   guard let data = dataFromFile("ServerData") else { return }

    let persons = Person()

    do {

        if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] {

            if let data = json["data"] as? [[String:AnyObject]]{

                for eachItem in data{
                    persons.name = eachItem["name"] as! String
                    persons.title = eachItem["title"] as! String
                    persons.address = eachItem["address"] as! String

                    try! realm.write {
                        realm.add(persons)
                    }
                }

            }
        }
    } catch {

        print("Error deserializing JSON: (error)")
    }
}
185   2  

2 ответов:

Не изменяйте объект persons и не добавляйте его в область снова. Ошибка, которую вы видите, заключается в том, что вы добавляете людей в область, а затем редактируете ее на второй итерации в for eachItem in data снова. Persons уже добавлен в область в этой итерации, и вы пытаетесь дать ему новое имя вне транзакции записи области. Вот почему вы видите ошибку. Лучше создать новый объект для каждого человека.

func add(){
    guard let data = dataFromFile("ServerData") else { return }

    do {
        if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] {
            if let data = json["data"] as? [[String:AnyObject]]{
                for eachItem in data{
                    let persons = Person()
                    persons.name = eachItem["name"] as! String
                    persons.title = eachItem["title"] as! String
                    persons.address = eachItem["address"] as! String

                    try! realm.write {
                        realm.add(persons)
                    }
                }

            }
        }
    } catch {
        print("Error deserializing JSON: \(error)")
    }
}

Как показывает ошибка, вам нужно предварительно сформировать транзакцию внутри записи,

Один из вариантов-написать каждому человеку индивидуально:
for eachItem in data{
    let person = Person()
    person.name = eachItem["name"] as! String
    person.title = eachItem["title"] as! String
    person.address = eachItem["address"] as! String

    try! realm.write {
         realm.add(person)
    }
}

Второй вариант-построить объект, а затем написать:

for eachItem in data{
    let person = Person();
    person.name = eachItem["name"] as! String
    person.title = eachItem["title"] as! String
    person.address = eachItem["address"] as! String
    persons.add(person)
}
try! realm.write {
    realm. append(persons)
}

Возможно, вам потребуется внести в это несколько изменений, но это идея.

    Ничего не найдено.

Добавить ответ:
Отменить.