Realmswift数据模型
class User {
let id = RealmOptional<Int>()
dynamic var name = ""
let albums = List<Album>()
override static func primaryKey() -> String {
return "id"
}
}
class Album: Object {
dynamic albumName = ""
let imageIDs = List<ImageID>()
}
class ImageID: Object {
let imageId = RealmOptional<Int>()
}
JSON数据
{
"10001": {
"id" : 10001,
"name": "John",
"album": {
"albums": [
{
"albumName": "Summer1999",
"imageIds": [11223, 11224, 11227]
},
{
"albumName": "Xmas1999",
"imageIds": [22991, 22997]
},
{
"albumName": "NewYear2000",
"imageIds": [5556, 776, 83224, 87543]
}
]
}
}
}
我有上面的json数据,我使用SwiftyJSON来解析数据然后写入领域。除了检查和更新数据(例如,json文件上的imageIds已经改变)外,一切都工作得很好。
问题:如何比较JSON数组和RealmSwift List以确定是否需要将任何更新写入数据库?
答案 0 :(得分:1)
您可以在此处利用主键。正如Realm Swift documentation所述:
使用主键创建和更新对象:如果是模型类 包括主键,您可以让Realm智能地更新或添加 基于主键值的对象使用 境界()添加。(_:更新:)。
所以(我假设您从某种请求中获取JSON(REST等),然后使用SwiftyJSON解析它以创建“用户”对象)您可以将新的“用户”对象视为常规新对象用户'并尝试像往常一样将其添加到Realm,但'update'参数必须为'true'。如果已经有一个用户具有您尝试添加的“用户”对象的ID,它将只更新现有的“用户”,即通过解析新的JSON数据从创建的新“用户”更改其修改后的值。这可能看起来像这样:
//Parse JSON and create a 'User'
let newUserFromJSON = parseAndCreateUserFromJSON(JSONData)
let realm = try! Realm()
do {
try realm.write {
realm.add(newUserFromJSON, update: true)
}
} catch let error as NSError {
print("error writing to realm: \(error.description) & \(error)")
} catch {
print("error writing to realm: UNKNOWN ERROR")
}
答案 1 :(得分:0)
我担心这可能不容易回答。 Realm中没有机制可以将Realm对象的内容与外部对象进行比较,以查看它们的数据是否匹配。您需要迭代Realm对象中的每个对象并手动比较它。
这不会编写太多代码(因为您可以通过Realm对象的objectSchema
属性获取所有Realm文件属性的列表,然后使用key-值编码将它们在单个for循环中拉出来),但仍然需要相当大的开销来执行比较。
话虽如此,如果您想要查看的内容只是某些属性可能会发生变化(例如您所说的,只有imageIDs
属性),那么您可以轻松地检查您的值需要。
bcamur所建议的绝对是最快的(并且通常首选JSON处理)解决方案。只要您正确设置了主键,就可以调用Realm.add(_:, update:)
并将更新设置为true
来更新对象。
请记住,这并没有将新数据与Realm中的数据合并;它会用新值完全覆盖旧对象,如果它听起来像你的ID号正在改变,那将是最好的行动方案。