Как изменить свойство Realm на nullable? - PullRequest
0 голосов
/ 23 января 2020

Как изменить CalendarEvent.notes на необязательный (обнуляемый)?

class CalendarEvent: Object {
    @objc dynamic var date: String = ""
    @objc dynamic var notes: String = ""
    @objc dynamic var notification: String = ""
}

База данных Realm уже заполнена данными. Я хочу, чтобы свойство notes было изменено на обнуляемое в базе данных Realm. Если я пытаюсь @objc dynamic var notes: String? = "", появляется ошибка времени выполнения, в которой указывается Migration is required due to the following errors: - Property 'CalendarEvent.notes' has been made optional.

. Согласно документации Realm, переименование свойства во время миграции является способом достижения этой цели. Можно ли изменить это свойство на nullable и без переименования?

1 Ответ

1 голос
/ 23 января 2020

Вы можете просто обработать это в блоке миграции и использовать то же имя свойства, это нормально. Вот код, который перенесет необязательное свойство first_name в необязательное свойство first_name.

Исходный объект выглядит следующим образом

class PersonClass: Object {
    @objc dynamic var first_name = ""

, а затем мы изменим свойство на необязательное

class PersonClass: Object {
    @objc dynamic var first_name: String? = nil

и вот блок миграции, чтобы сделать это. Первая версия была 1 (с необязательным first_name), а версия 2 имеет обновленный объект.

let vers = UInt64(2)
let config = Realm.Configuration( schemaVersion: vers, migrationBlock: { migration, oldSchemaVersion in
     print("oldSchemaVersion: \(oldSchemaVersion)")
     if (oldSchemaVersion < vers) {
        print("  performing migration")

        migration.enumerateObjects(ofType: PersonClass.className()) { oldItem, newItem in
            newItem!["first_name"] = oldItem!["first_name"]
         }
     }
 })

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

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