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