ios - 使用 Realm 和结果 JSON

标签 ios arrays swift swift3 realm

我是 Realm 的新手,我正在尝试在我的项目中使用 Realm 。在这里,我试图解析 JSON 并使用 realm 保存它。当我试图遍历结果数组时发生错误

'Attempting to modify object outside of a write transaction - call beginwritetransaction on an RLMRealm instance first'

这是 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)")
    }
}

最佳答案

不要修改persons 对象并将其再次添加到 Realm 中。您看到的错误是因为您将人员添加到 Realm ,然后在 for eachItem in data 的第二次迭代中再次对其进行编辑。 Persons 已在此迭代中添加到 Realm ,您尝试在 Realm 写入事务之外为其指定一个新名称。这就是您看到错误的原因。最好为每个人创建一个新对象。

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

关于ios - 使用 Realm 和结果 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45687792/

相关文章:

ios - swift : Adding SSL key to URLRequest

ios - 如何禁用/启用 UITextField 中的返回键?

c# - 初始化数组中的几个特定值,将 rest 设置为默认值

ios - 将地址快速转换为坐标

swift - 快速思考 C# 保护访问器的正确方法是什么?

html - 在 Mobile Safari 的 CSS 中使用 float right 时字体大小错误

ios - 请求 caretRectForPosition : while the NSTextStorage has outstanding changes

c++ - valgrind:内存泄漏(不匹配的 free()/delete/delete[] )

C++ 类变量不会保留从另一个类传递的二维对象数组的值

ios - 动画按钮 360 顺时针旋转和反向旋转