У меня есть предварительно заполненная база данных для моего приложения. Время от времени я буду обновлять эту предварительно заполненную базу данных новыми данными. Проблема в том, что объект содержит логическое поле под названием «завершено». По умолчанию это поле ложно. Когда пользователь выполняет определенную задачу, логическое поле объекта становится истинным. Я хочу найти способ при переходе на новую предварительно заполненную базу данных сохранить это логическое поле таким же, как и раньше.
Вот код, который у меня есть на данный момент
// copy over old data files
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let defaultParentURL = defaultURL.deletingLastPathComponent()
if let v0URL = bundleURL("database") {
//Delete if there's a file already
do {
try FileManager.default.removeItem(at: defaultURL)
print("Item Removed")
} catch {
print("error removing seeds: \(error)")
}
//Copy the database file to the directory
do {
try FileManager.default.copyItem(at: v0URL, to: defaultURL)
print("Item Copied")
}catch {
print("error copying seeds: \(error)")
}
}
// define a migration block
// you can define this inline, but we will reuse this to migrate realm files from multiple versions
// to the most current version of our data model
let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
migration.enumerateObjects(ofType: BookModel.className()) { oldObject, newObject in
// keep the old boolean completed value and assign it to the new one
let completed = oldObject!["completed"] as! Bool
newObject!["completed"] = completed
print(completed)
}
print("Migration complete.")
}
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 5, migrationBlock: migrationBlock)
let realm = try! Realm()
return true
Я подозреваю, что мой код не работает, потому что до переноса я уже удалил свою предыдущую базу данных (которая содержит заполненные пользователем значения). Но как я могу заменить свою предыдущую базу данных на новую без удаления-копирования?
Я могу решить эту проблему с помощью userDefaults, но я бы предпочел вышеуказанное решение.
Заранее спасибо!
Когда вы обновляете базу данных новыми данными, включает ли это изменение схемы? Если нет, я бы вообще не использовал миграции для этого, просто простое обновление. (Это, конечно, не ответ на ваш реальный вопрос, но все же это должно упростить задачу.)
В большинстве случаев это будут просто новые данные. Новые экземпляры в базу данных без изменения структуры. Так что да, миграция на самом деле не нужна в этом смысле. Я не нашел другого способа удобно обновить предварительно заполненные данные, не заменяя их другой базой данных. Я хочу обновить свои данные через RealmStudio.