Объединение Realm с приложением и миграцией

Я следую документации Realm по миграции и связыванию области с приложением.

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

let initialURL = NSBundle.mainBundle().URLForResource("bootstrap_v001", withExtension: "realm")!
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!

if Realm.Configuration.defaultConfiguration.schemaVersion == 0 {
    do {
        try NSFileManager.defaultManager().removeItemAtURL(defaultURL)
        try NSFileManager.defaultManager().copyItemAtURL(initialURL, toURL: defaultURL)
    } catch {
        // Handle error here
        print("realm delete copy error!!")
    }
}

Все это работает нормально, и я вижу правильный файл Realm, в котором есть данные. Однако, если я использую realm = try! Realm(), результаты, которые он возвращает, всегда пусты.

Следует отметить, что у меня есть следующее объявление в верхней части AppDelegate.swift.

import UIKit
import RealmSwift
let uiRealm = try! Realm()

Я не уверен, что это первоначальное глобальное объявление uiRealm вызывает проблему. Я также пытался объявить локальные версии, но это, похоже, не исправляет.

Следует отметить, что если я повторно запускаю приложение, когда файл Realm уже на месте, все в порядке.


person Michael Moulsdale    schedule 04.09.2016    source источник


Ответы (1)


Спасибо за пояснение, что uiRealm инстанцирование в верхней части вашего делегата. Я почти уверен, что это будет причиной проблемы.

Realm кэширует внутренние копии своих Realm экземпляров, поэтому чрезвычайно важно, чтобы при перемещении каких-либо файлов на диске вы делали это до того, как создадите какие-либо Realm() объекты (или выполните какие-либо операции Realm, в которых создаются Realm экземпляры, инкапсулированные в @autoreleasepool). ).

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

person TiM    schedule 06.09.2016