首页 > 解决方案 > 如何在 Realm 迁移中保持某些更改的属性不变 - Swift

问题描述

当你有一个看起来像这样的 Realm 模型时:

class Thing: Object, Decodable {
  @objc dynamic var id: String = ""
  @objc dynamic var propertyOne: String = ""
  @objc dynamic var propertyTwo: String? = nil

  override static func primaryKey() -> String? {
      return "id"
  }
}

所有数据都来自 JSON 文件,使用 JSON 序列化器:

func serialize(input sourceName: String) {
    let path = Bundle.main.path(forResource: sourceName, ofType: nil)
    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 things = try jsonDecoder.decode([Thing].self, from: data)
            let realm = try! Realm()
            for thing in things {
                try! realm.write {
                    realm.add(thing)
                    // realm.add(thing, update: .modified) wipes out all changes
                }
            }
        } catch let error {
            print("failed to convert data: \(error)")
        }
    } catch let error {
        print(error)
    }
}

propertyOne的信息来自 JSON。propertyTwo的值意味着从应用程序内输入。一旦我再次序列化 JSON,所有更改propertyTwo都将被清除。如何在不将其还原到原始 JSON 文件的情况下进行迁移?我想在迁移/新序列化期间保持一些属性不变。

在我的 AppDelegate 中,这是我的代码didFinishLaunchingWithOptions

let serializer = JSONSerializer()
serializer.serialize(input: "Nafliah.json")

如果我realm.add(thing, update: .modified)的序列化程序中有此功能。但这会清除应用程序中所做的所有更改。如果我将其更改为:

if save.bool(forKey: "serilized") == false {
    let serializer = JSONSerializer()
    serializer.serialize(input: "Nafliah.json")
    save.set(true, forKey: "serilized")
}

并制作序列化程序部分realm.add(thing),它可以工作并且不会在每次打开应用程序时清除更改的数据。

问题是,一旦我将一个新对象添加到 JSON 文件,它显然不会被添加到领域。我必须再次序列化 JSON。但是,这会删除在 2 个属性中所做的所有更改,这些更改仅供用户在应用程序中更改。

标签: jsonswiftrealm

解决方案


请查看以下链接以获取现有属性的 Migrating Realm

https://docs.realm.io/sync/v/3.x/using-synced-realms/migrating-your-data


推荐阅读