миграция области, невозможно добавить свойство

область тестирования, не могу добавить новое свойство в мой тестовый класс. Следующая документация и некоторые ответы здесь, но оба не работают. В моем коде даже «простой» пустой блок по умолчанию для миграции не работает с использованием обновленной области.

получение этой ошибки

Тема 1: Неустранимая ошибка: «попробуйте!» выражение неожиданно вызвало ошибку: Error Domain = io.realm Code = 10 «Миграция требуется из-за следующих ошибок: - Добавлено свойство ComicType.creationDate». UserInfo = {NSLocalizedDescription = Миграция требуется из-за следующих ошибок: - Добавлено свойство ComicType.creationDate., Код ошибки = 10}

кажется, я не меняю schemaVersion, но я сделал это в «базовом» блоке миграции. Я проверяю версию схемы в делегате приложения с помощью:

 let configCheck = Realm.Configuration();
        do {
            let fileUrlIs = try schemaVersionAtURL(configCheck.fileURL!)
            print("schema version \(fileUrlIs)")
        } catch  {
            print(error)
        }

мой AppDelegate:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { migration, oldSchemaVersion in

                if (oldSchemaVersion < 1) {
                }

        })

        Realm.Configuration.defaultConfiguration = config

        _ = try! Realm()



        return true
    }

мои занятия:

import Foundation
import RealmSwift

class ComicType: Object {
    @objc dynamic var name : String = ""
    @objc dynamic var creationDate : Date? //the new property

}

person biggreentree    schedule 11.10.2018    source источник
comment
Пожалуйста, укажите не работает. Вам не нужно ничего делать в блоке миграции, Realm может обрабатывать такую ​​простую миграцию (добавление нового свойства со значением по умолчанию), поэтому должно быть что-то еще, если пустой блок миграции не сработал.   -  person Dávid Pásztor    schedule 11.10.2018
comment
добавил сообщение об ошибке   -  person biggreentree    schedule 11.10.2018
comment
Вы уверены, что ваш schemaVersion просто должен быть 1? Это ваша первая миграция?   -  person Dávid Pásztor    schedule 11.10.2018
comment
да, это тестовое приложение, с редактированием объектов все прошло успешно, но при тестировании скриптов миграции я не могу избавиться от этой ошибки.   -  person biggreentree    schedule 11.10.2018
comment
В качестве теста я скопировал и вставил ваш код в проект с исходным свойством createDate ComicType. В коде я добавил несколько объектов. Затем я закомментировал старую CreationDate и раскомментировал новую, изменил schemaVersion на 2 и запустил код. Все работало нормально. Затем я внес ряд изменений (добавление и удаление свойств и т. Д.) В объект ComicType, каждый раз обновляя номер миграции, и он работал правильно. Кроме того, чего вы ожидаете, изменяя необязательный параметр var Date? = nil на другую необязательную переменную creationDate: Date?. Это изменение не требует миграции.   -  person Jay    schedule 11.10.2018
comment
возможно, я делаю что-то не так, такая же ошибка в другом проекте, классе Person, со строкой имени. Сохраните и прочитайте какой-то объект, все в порядке, затем добавьте age как int к классу, затем примените «простой» код в делегате приложения с 1 для обоих значений, ошибка, поэтому изменилось на «2» первое значение, снова ошибка. Что касается вашего вопроса, я не нашел, как просто добавить необязательный параметр, поэтому я попытался указать начальное значение в соответствии с оперативной обработкой в ​​Realm, не более того. В моем проекте CreationDate было добавлено как новое свойство, есть ли способ сбросить версию схемы и попробовать все заново?   -  person biggreentree    schedule 12.10.2018
comment
добавлен код для проверки текущей версии схемы, похоже, скрипт вообще не работает, изменение версии схемы не записывается, всегда 0   -  person biggreentree    schedule 12.10.2018


Ответы (2)


Проблема решена таким образом: настоящая проблема заключается не в номере схемы, а в том, чтобы вообще не вызывать код миграции, я понял, что схема миграции всегда остается той же. Истинная ошибка вызывает let realm = try! Realm() в моем контроллере представления, используя его как глобальную константу. Теперь использую lazy var realm = try! Realm(). Отличную помощь можно найти здесь. Теперь после каждого изменения в моей модели я обновляю в appDelegate schemaVersion.

person biggreentree    schedule 12.10.2018
comment
Код миграции не вызывается, поскольку в моем комментарии к вашему вопросу нечего переносить. Необязательный параметр является необязательным, поэтому указание nil optional как nil ничего не делает, поэтому мигрировать нечего. Другими словами, тип переменной не изменяется ни на что иное, поэтому код миграции не вызывается. - person Jay; 12.10.2018
comment
Я думаю, что мы неправильно поняли друг друга и, следовательно, проблему. У оригинальной модели было только название. Через секунду я попытался добавить дату. Оба они являются тестами, позволяющими заставить работать блок миграции. - person biggreentree; 12.10.2018

Что сработало, так это удалить приложение из симулятора iOS, а затем снова запустить его с помощью XCode. Подробнее об этом можно прочитать здесь: https://github.com/RocketChat/Rocket.Chat.iOS/issues/104

Я столкнулся с аналогичной проблемой, моя трассировка стека ошибок начиналась так:

`fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:

Показанные ошибки просто подтверждали, что некоторые объекты были сохранены локально. Итак, не было никакой подсказки о том, что вызвало проблему.

Я решил, что проблема заключалась в том, что была нарушена схема базы данных Realm, поскольку я обновлял классы объектов, которые сохранял локально. Итак, он попросил меня обновить схему.

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

person Lenda    schedule 21.04.2020