我们如何比较 RealmSwift List 和 Json 嵌套数组中的值?
Posted
技术标签:
【中文标题】我们如何比较 RealmSwift List 和 Json 嵌套数组中的值?【英文标题】:How do we compare the value in RealmSwift List and Json nested Array? 【发布时间】:2016-02-11 12:31:56 【问题描述】: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 列表以确定是否需要将任何更新写入数据库?
【问题讨论】:
【参考方案1】:您可以在此处利用您的主键。正如 Realm Swift documentation 所说:
使用主键创建和更新对象:如果您的模型类 包含主键,你可以让 Realm 智能更新或添加 对象基于它们的主键值,使用 领域().add(_:update:)。
因此(我假设您从某种请求(REST 等)中获取 JSON,然后使用 SwiftyJSON 对其进行解析以创建“用户”对象)您可以将新的“用户”对象视为常规的新对象User' 并尝试像往常一样将其添加到 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")
【讨论】:
感谢您的回复,因为我已经在它在主级别上完美更新之前对其进行了测试,但是当涉及到嵌套数据时,它会将其解耦并使用新值进行更新,从而留下大量与父数据(用户、相册等)没有任何链接的重复项 那我猜你需要手动操作或者更新后删除重复的数据。很抱歉没有成功。【参考方案2】:恐怕这个问题可能没有简单的答案。 Realm 中没有将 Realm 对象的内容与外部对象进行比较以查看它们的数据是否匹配的机制。您需要遍历 Realm 对象中的每个对象并手动比较它。
这不会写太多代码(因为您可以通过 Realm 对象的objectSchema
属性获取所有 Realm 文件属性的列表,然后使用键值编码将它们拉出单个 for 循环),但执行比较仍然会产生相当大的开销。
话虽如此,如果您只想查看某些可能会更改的属性(即如您所说,只是 imageIDs
属性),那么您可以轻松地检查您需要的值。
bcamur 所建议的绝对是这里最快的(通常是 JSON 处理的首选)解决方案。只要您正确设置了主键,您就可以调用Realm.add(_:, update:)
并将更新设置为true
来更新对象。
请记住,这不会将新数据与 Realm 中已有的数据合并;它会用新值完全覆盖旧对象,如果听起来你的 ID 号正在改变,那将是最好的做法。
【讨论】:
感谢您的回复。使用 User 数据模型的主键,imageIDs 或 Album 上的数据只是与更新的数据一起插入,但它留下了所有旧的数据,就像一些迷失的灵魂坐在数据库中一样。以上是关于我们如何比较 RealmSwift List 和 Json 嵌套数组中的值?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 14.0 之后如何解决 SwiftUI 中 RealmSwift.App 和 SwiftUI.App 的冲突?
RealmSwift 限制和获取最后 30 条记录到 tableview