如何使用单个JSON更新整个Realm

时间:2016-06-24 02:31:41

标签: json swift realm

我有一个JSON,它是整个Realm的精确导出。我想导入此JSON来替换/更新整个Realm。如何从此JSON批量更新整个Realm?

这是我的JSON检索:

Alamofire.request(.GET, url).responseJSON { response in
    if let JSON = response.result.value {
        let realm = try! Realm()
        try! realm.write {
            let json = try! NSJSONSerialization.JSONObjectWithData(JSON as! NSData, options: NSJSONReadingOptions())
            let exercise = Exercise(value: json)
            realm.add(exercise, update: true)
        }
    }
}

型号:

final class Exercise: Object {

    dynamic var id: String = NSUUID().UUIDString
    dynamic var name = ""
    dynamic var notes: String?
    var workoutDiary = List<Workout>()
    dynamic var goal = 0

    override class func primaryKey() -> String? {
        return "id"
    }

}

final class Workout: Object {

    dynamic var date = NSDate()
    var sets = List<WorkSet>()

}

2 个答案:

答案 0 :(得分:0)

要将add(:_, update: _)update = true一起使用,您至少需要将id Exercise字段定义为主键。

如果您还没有为Workout定义主键,那么您的旧练习将不会被删除。在重新创建Exercise对象之前,您需要手动查询该情况下的Exercise,然后自行删除锻炼。

答案 1 :(得分:0)

所以我想出了一个使用ObjectMapper和AlamofireObjectMapper的工作解决方案。我不喜欢这个,因为realm.deleteAll()感觉有点蛮力,但似乎有效。

如果没有ObjectMapper,我遇到了NSDateWorkout字段反序列化JSON的问题。没有ObjectMapper似乎可行,我只是无法让它工作。

如果没有realm.deleteAll(),此函数的每次运行都将复制嵌套的List对象List<Workouts>List<WorkSet>。虽然Exercise对象在更新时不会重复,但Exercise的所有子对象都是。

Alamofire.request(.GET, url).responseArray { (response: Response<[Exercise], NSError>) in
            switch response.result {
                case .Success:
                let exercises = response.result.value
                if let exercises = exercises {
                    let realm = try! Realm()
                    try! realm.write {
                        realm.deleteAll()
                        realm.add(exercises)
                    }
                }
                case .Failure(let error):
                    print(error)
            }
        }