Swift: как перенести пользовательское царство - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь выполнить миграцию для моего пользовательского файла Realm. Обратите внимание, что в этом проекте у меня есть два пользовательских файла областей поверх файла области по умолчанию: Photo.realm и Transport.realm. Я включил новый атрибут в объект Photo следующим образом:

class Photo: Object {
    @objc dynamic var id: String? = nil
    @objc dynamic var secret: String? = nil
    @objc dynamic var server: String? = nil
    @objc dynamic var farm: Int = 0
    @objc dynamic var imageData: Data? = nil
    @objc dynamic var tranport: Transport? //Newly added attribute
}

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

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let defaultConfig = Realm.Configuration()

    if let fileURL = defaultConfig.fileURL {
        let photoRealmFileURL = fileURL.deletingLastPathComponent().appendingPathComponent("Photo.realm")
        let photoMigrationConfig = Realm.Configuration(fileURL: photoRealmFileURL, schemaVersion: 1, migrationBlock: { (migration, oldSchemaVersion) in
            if (oldSchemaVersion < 1) {

            }
        }, objectTypes: [Photo.self])

        do {
            let _ = try Realm(configuration: photoMigrationConfig)
        } catch let error {
            print("Migration Error", error.localizedDescription)
        }

    }

    return true
}

В моем HomeController я запускаю свои сферы так:

class HomeController: UICollectionViewController {

    var photoRealm = try! Realm()
    var transportRealm = try! Realm()

    override func viewDidLoad() {
        super.viewDidLoad()

        setupRealm()
    }

    fileprivate func setupRealm() {
        let defaultConfig = Realm.Configuration()

        if let fileURL = defaultConfig.fileURL {
            let photoRealmFileURL = fileURL.deletingLastPathComponent().appendingPathComponent("Photo.realm")
            let photoConfig = Realm.Configuration(fileURL: photoRealmFileURL, objectTypes: [Photo.self])

            let transportRealmFileURL = fileURL.deletingLastPathComponent().appendingPathComponent("Transport.realm")
            let tranportConfig = Realm.Configuration(fileURL: transportRealmFileURL, objectTypes: [Transport.self])

            do {
                photoRealm = try Realm(configuration: photoConfig)
                transportRealm = try Realm(configuration: tranportConfig)

                let cars = Transport()
                cars.name = "cars"

                let planes = Transport()
                planes.name = "planes"

                try transportRealm.write {
                    transportRealm.add(cars)
                    transportRealm.add(planes)
                }

            } catch let error {
                print("Error setting Realm", error.localizedDescription)
            }
        }
    }

При этом мне выдается ошибка:

Тема 1: Неустранимая ошибка: 'попробуй!' Выражение неожиданно вызвало ошибку: Ошибка домена = код io.realm = 10 "Миграция требуется из-за следующие ошибки: - Добавлено свойство «Photo.tranport». "UserInfo = {NSLocalizedDescription = Миграция требуется из-за следующие ошибки: - Добавлено свойство 'Photo.tranport'. Код ошибки = 10}

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

1 Ответ

0 голосов
/ 18 января 2019

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

Добавьте эти строки кода в метод 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

    if oldSchemaVersion < 1 {
     // Add your class name where you have added new property 'tranport'.
      migration.enumerate(Photo.className()) { oldObject, newObject in
        newObject?["tranport"] = "Your value"
      }    
    }
  }
) 
Realm.Configuration.defaultConfiguration = config
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...