【问题标题】:Realm Swift object duplicates on every JSON serializationRealm Swift 对象在每个 JSON 序列化上都重复
【发布时间】:2020-08-31 22:53:34
【问题描述】:

当我的应用程序第一次下载时,它需要一个 JSON 文件并将其序列化到一个 Realm 数据库中。这是我发现的唯一一种允许我预填充领域数据库并同时使其可写的方法。由于 Realm 不接受字符串列表,因此我必须使用 text 属性创建一个名为 MyString 的对象。

问题:
我的应用程序在每次新更新时都会重新序列化 JSON,以说明数据库中的更改。只有只读属性被重写。我就是这样做的:

func serialize() {
    let path = Bundle.main.path(forResource: "JSONFile", ofType: "json")
    let url = URL(fileURLWithPath: path!)
    let jsonDecoder = JSONDecoder()
    do {
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
        guard json is [AnyObject] else { assert(false, "failed to parse"); return }
        do {
            let myItems = try jsonDecoder.decode([Item].self, from: data)
            for myItem in myItems {
                try! realm.write {
                    realm.create(Item.self, value: [
                        "id": myItem.id,
                        "entitle": myItem.entitle,
                        "artitle": myItem.artitle,
                        "submenus": myItem.submenus, // This is a List<MyString>
                        "dates": myItem.dates        // This is a List<MyString>
                    ], update: .modified)
                    // Other write-only propeties are left out to not overwrite the user's changes
                }
            }
        } catch let error { print("failed to convert data: \(error)") }
    } catch let error { print(error) }
}

现在,每次我的应用更新(以及第一次打开应用)时,此代码都会运行并重做所有序列化。 update: .modified 允许我不复制 Item 对象,这很棒。但是,每次运行时,它都会创建一个新的MyString 对象,而不是覆盖它。现在每个人都将每个 MyString 对象复制了 5 次,并且每次更新都会增加。有没有办法:

  1. 删除当前用户的所有重复项? 5 个副本中有 4 个未使用。它们只存在于数据库中。我不能在每次序列化之前删除所有MyString 对象,因为其中一些是用户输入的只写属性。删除所有这些也会删除用户的数据。
  2. 让它每次都不会重复?我尝试添加一个primaryKey 作为name,但它给了我这个错误:Primary key property 'class_MyString.text' has duplicate values after migration.。问题是,它们并不都是独一无二的。他们中的许多人共享相似的text,那么我如何区分它们呢?

【问题讨论】:

    标签: swift realm json-serialization


    【解决方案1】:

    您可以预填充 Realm 文件并将其作为应用程序包的一部分包含在内。请参阅此文档:https://realm.io/docs/swift/latest/#bundling-a-realm

    在添加/更新已存在的对象时也使用realm.add(Item(), update: .modified)

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多