Работа с областью и результатом JSON
Я новичок в области, и я пытаюсь использовать царстве в моем проекте. Здесь я пытаюсь разобрать JSON и сохранить его с помощью realm. Когда я пытаюсь выполнить цикл через результирующий массив, возникает ошибка
'попытка изменить объект вне транзакции записи-сначала вызовите beginwritetransaction на экземпляре RLMRealm'
Это результат JSON:
{"data":[{"id":1,"parent_id":0,"name":"JenniferMaenle","title":"Ms","phone":"","address":"Toled, ohio","email":"[email protected]","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)")
}
}
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) }Возможно, вам потребуется внести в это несколько изменений, но это идея.
Comments