Как сохранить некоторые измененные свойства неизменными в миграции Realm - Swift - PullRequest
0 голосов
/ 13 марта 2020

Если у вас есть модель 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 свойствах, которые должны быть изменены только пользователем в приложении.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Я понял это. Вы должны выполнить частичную сериализацию.

Изменено это:

realm.add(thing, update: .modified)

Кому:

realm.create(Thing.self, value: [
   "id": thing.id,
   "propertyOne": thing.propertyOne
   // Leave out propertyTwo to leave it unchanged
], update: .modified)
0 голосов
/ 13 марта 2020

Пожалуйста, проверьте ниже ссылку для Migrating Realm для существующих свойств

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...