我们如何比较RealmSwift List和Json嵌套数组中的值?

时间:2016-02-11 12:31:57

标签: arrays json swift2 realm swifty-json

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以确定是否需要将任何更新写入数据库?

2 个答案:

答案 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号正在改变,那将是最好的行动方案。