Выполните итерацию по всем записям в Realm сразу после запуска миграции - Swift / iOS - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть приложение iOS / Swift, где мне нужно изменить и добавить некоторые новые свойства к объекту Realm, что означает, что мне придется создать новую схему и изменить некоторые из существующих данных внутри Realm соответственно,он работает с новыми изменениями.

Где было бы лучше всего разместить мой код для реструктуризации существующих данных внутри Realm, как только приложение запустится?

РЕДАКТИРОВАТЬ:
Я знаю, как создать миграцию и где это сделать.

Я не уверен, что было бы хорошим местом для перебора всех записей в Realm сразу после запуска кода миграции, чтобы внести некоторые изменения в существующие данные в Realm.

Если быть более точным, главная причина, по которой мне нужно перебирать записи, - это то, что в настоящее время я использую свойство String для хранения quantities следующим образом ... 2 pcs, не спрашивайтеМне почему, но теперь мне нужно удалить pcs из значений количества, чтобы оставить только 2, чтобы иметь возможность изменить свойство на Int или Double.Я знаю, я знаю, что глупо использовать строку для хранения количества.

1 Ответ

1 голос
/ 17 апреля 2019

Написать код миграции в методе AppDelegate disFinishLaunchWithOptions.

Пожалуйста, обратитесь ниже ссылки:

realm.io официальные документы

Локальные миграции:

Локальные миграции определяются настройкой Realm.Configuration.schemaVersion и Realm.Configuration.migrationBlock. Ваш блок миграции предоставляет все логика преобразования моделей данных из предыдущих схем в новые схемы. При создании области с этой конфигурацией, миграция будет применен блок для обновления области до указанной версии схемы если необходима миграция.

Предположим, мы хотим перенести модель Person, объявленную ранее. минимально необходимый блок миграции будет следующим:

// Inside your application(application:didFinishLaunchingWithOptions:)

let config = Realm.Configuration(
    // Set the new schema version. This must be greater than the previously used
    // version (if you've never set a schema version before, the version is 0).
    schemaVersion: 1,

    // Set the block which will be called automatically when opening a Realm with
    // a schema version lower than the one set above
    migrationBlock: { migration, oldSchemaVersion in
        // We haven’t migrated anything yet, so oldSchemaVersion == 0
        if (oldSchemaVersion < 1) {
            // Nothing to do!
            // Realm will automatically detect new properties and removed properties
            // And will update the schema on disk automatically
        }
    })

// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config

// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let realm = try! Realm()

Обновление:

realm.io официальные документы уже вся предоставленная информация, необходимая для миграции.

Местные миграции

Если вы хотите добавить новое свойство только тогда, приведенный выше код будет работать для вы. Не нужно перебирать все записи. Старая запись сохраняет свои значения по умолчанию значение в соответствующей строке.

Обновление значений

Если вы хотите добавить новое свойство, используя существующее значение столбца. Вы нужно перебрать все записи. Пожалуйста, обратитесь ниже код.

// Inside your application(application:didFinishLaunchingWithOptions:)

Realm.Configuration.defaultConfiguration = Realm.Configuration(
    schemaVersion: 1,
    migrationBlock: { migration, oldSchemaVersion in
        if (oldSchemaVersion < 1) {
            // The enumerateObjects(ofType:_:) method iterates
            // over every Person object stored in the Realm file
            migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
                // combine name fields into a single field
                let firstName = oldObject!["firstName"] as! String
                let lastName = oldObject!["lastName"] as! String
                newObject!["fullName"] = "\(firstName) \(lastName)"
            }
        }
    })

Переименование свойств

Если вы хотите просто переименовать свойство, используйте приведенный ниже код.

// Inside your application(application:didFinishLaunchingWithOptions:)

    Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 1,
        migrationBlock: { migration, oldSchemaVersion in
            // We haven’t migrated anything yet, so oldSchemaVersion == 0
            if (oldSchemaVersion < 1) {
                // The renaming operation should be done outside of calls to `enumerateObjects(ofType: _:)`.
                migration.renameProperty(onType: Person.className(), from: "yearsSinceBirth", to: "age")
            }
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...