Область: обновление предварительно заполненной базы данных с сохранением данных из определенного поля.

avatar
AresProductions
8 апреля 2018 в 06:16
350
0
0

У меня есть предварительно заполненная база данных для моего приложения. Время от времени я буду обновлять эту предварительно заполненную базу данных новыми данными. Проблема в том, что объект содержит логическое поле под названием «завершено». По умолчанию это поле ложно. Когда пользователь выполняет определенную задачу, логическое поле объекта становится истинным. Я хочу найти способ при переходе на новую предварительно заполненную базу данных сохранить это логическое поле таким же, как и раньше.

Вот код, который у меня есть на данный момент

// 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, но я бы предпочел вышеуказанное решение.

Заранее спасибо!

Источник
dr_barto
8 апреля 2018 в 09:57
1

Когда вы обновляете базу данных новыми данными, включает ли это изменение схемы? Если нет, я бы вообще не использовал миграции для этого, просто простое обновление. (Это, конечно, не ответ на ваш реальный вопрос, но все же это должно упростить задачу.)

AresProductions
8 апреля 2018 в 10:46
0

В большинстве случаев это будут просто новые данные. Новые экземпляры в базу данных без изменения структуры. Так что да, миграция на самом деле не нужна в этом смысле. Я не нашел другого способа удобно обновить предварительно заполненные данные, не заменяя их другой базой данных. Я хочу обновить свои данные через RealmStudio.

Ответы (0)