我有一个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>()
}
答案 0 :(得分:0)
要将add(:_, update: _)
与update = true
一起使用,您至少需要将id
Exercise
字段定义为主键。
如果您还没有为Workout
定义主键,那么您的旧练习将不会被删除。在重新创建Exercise
对象之前,您需要手动查询该情况下的Exercise
,然后自行删除锻炼。
答案 1 :(得分:0)
所以我想出了一个使用ObjectMapper和AlamofireObjectMapper的工作解决方案。我不喜欢这个,因为realm.deleteAll()
感觉有点蛮力,但似乎有效。
如果没有ObjectMapper,我遇到了NSDate
中Workout
字段反序列化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)
}
}