我们如何比较 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中避免迁移

如何使用 RealmSwift 存储字典?

RealmSwift 限制和获取最后 30 条记录到 tableview

Swift 项目:ReactiveSwift+MVVM+RealmSwift+Alamofire+OM

RealmSwift:没有这样的模块“RealmSwift”