我是新手,我正在尝试在我的项目中使用Realm。在这里,我试图解析JSON并使用领域保存它。当我试图循环结果数组时发生错误
'尝试修改写事务之外的对象 - 首先在RLMRealm实例上调用beginwritetransaction'
这是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)")
}
}
答案 0 :(得分:2)
如错误所示,您需要在写入中预先形成事务
一种选择是单独写每个人:
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)
}
您可能需要对此进行一些更改,但这是个主意。
答案 1 :(得分: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)")
}
}