Скопируйте существующий файл базы данных Realm в расположение группы приложений для расширения сегодня - PullRequest
1 голос
/ 06 мая 2020

Мое iOS приложение использует базу данных Realm. Я хочу скопировать или переместить текущий файл базы данных default.realm в новый каталог (расположение группы приложений), чтобы я мог поделиться им с виджетом Today Extension.

Я пробовал, как говорится в этом сообщении ( Как перенести базу данных Realm в группы приложений )

Основной код:

let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
do{
    try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
}
catch{
    print("Error information: \(error)")
}

И я поместил этот код в область миграции Realm внутри didFinishLaunchingWithOptions , как показано ниже, чтобы дать вам более четкое представление, где я использую этот код.


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    var config = Realm.Configuration(
        schemaVersion: 1,
        migrationBlock: { migration, oldSchemaVersion in
            if (oldSchemaVersion < 1) {
                let fileManager = FileManager.default
                let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
                let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.myApp")!.appendingPathComponent("default.realm")
                do{
                    try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
                }
                catch{
                    print("Error information: \(error)")
                }
            }
    }
    )
}


Когда я пробую это, моя консоль сообщает, что файл не может быть сохранен.

Error Domain = NSCocoaErrorDomain Code = 512 «Файл« default.realm »не может быть сохранен в папке« 2EEADCEE-F9D9-44A8-BDED-B60A689656A2 ».» UserInfo = {NSFileOriginalItemLocationKey = file: /// Users / jm / Library / Developer / CoreSimulator / Devices / 38334AE3-6648-402E-AC18-8252426002D6 / data / Containers / Shared / AppGroup / 2EEADCEE-F9D9-44A8-BD656D-BD9D9-44A8-BD6D-BD6 default.realm, ......

Я слышал, что копирование / перемещение файла базы данных Realm должно быть выполнено перед открытием файла, связана ли эта ошибка с этим?

Спасибо за Ваша помощь и хорошего дня

1 Ответ

0 голосов
/ 15 мая 2020

Спасибо @Jay за комментарий, который помог мне найти способ.

Как он упомянул, перемещение файла Realm DB должно быть выполнено до того, как мы вызовем что-либо, имеющее отношение к Realm.

Первоначально у меня было код внутри миграции Realm, чтобы он запускался только один раз, когда версия схемы старее,

, но я переместил его за пределы, наверх didFinishLaunchingWithOptions, поэтому теперь он работает, перемещая файл Realm DB в другой каталог.

Надеюсь, это поможет тому, кто борется.


let fileManager = FileManager.default
let originalPath = Realm.Configuration.defaultConfiguration.fileURL!
let appGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")
if fileManager.fileExists(atPath: originalPath.absoluteString) {
    do{
        try fileManager.replaceItemAt(appGroupURL, withItemAt: originalPath)
        print("Successfully replaced DB file")
    }
    catch{
        print("Error info: \(error)")
    }
} else {
    print("File is not exist on original path")
}


var config = Realm.Configuration(
)
config.fileURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myApp")!.appendingPathComponent("default.realm")

// 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()

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