Быстрая копия файла области - не работает

Быстрая версия 3.

Я работаю над копированием моего файла realm.default в свое приложение при запуске, если он не существует, чтобы я мог упаковать его как часть распространения. Файл должен быть изменяемым, поэтому я копирую его в каталог документов.

К сожалению, я получаю сообщение об ошибке, что файл не существует. Я проверил, что пути верны и что в .app есть файл.

С учетом сказанного, файл имеет белый кружок с линией на нем (не вводите тип) и говорит, что я не могу открыть его на этом типе Mac, когда я пытаюсь его открыть. Я могу увидеть содержимое, выбрав показать содержимое пакета, и файл находится внутри.

Текст выше ..

Ниже приведен код моего делегата приложения, который загружает файл области:

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

func openRealm() {

    let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
    let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")

    if !FileManager.default.fileExists(atPath: String(describing: defaultRealmPath)) {
        do
        {
            try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: String(describing: defaultRealmPath))
        }
        catch let error as NSError {
        // Catch fires here, with an NSError being thrown
        print("error occurred, here are the details:\n \(error)")
        }
    }
}

Ниже приведены сообщения об ошибках (выделены жирным шрифтом для контекста):

произошла ошибка, вот подробности: Error Domain = NSCocoaErrorDomain Code = 4 «Файл« default.realm »не существует». UserInfo = {NSSourceFilePathErrorKey = / Users / имя пользователя / Library / Developer / CoreSimulator / Devices / 4965D609-499A-4AE5-8ECC-3266DAE4BA87 / data / Containers / Bundle / Application / B324E72E-2B5A-4A02-BC2NDA-FBame .app / default.realm, NSUserStringVariant = (Копировать), NSDestinationFilePath = file: /// Users / username / Library / Developer / CoreSimulator / Devices / 4965D609-499A-4AE5-8ECC-3266DAE4BA87 / data / Containers / Data / Application / 565716DD-E903-409F-B7C8-20154B0DF6BA / Documents / default.realm, NSFilePath = / Users / username / Library / Developer / CoreSimulator / Devices / 4965D609-499A-4AE5-8ECC-3266DAE4BA87 / data / Containers / Bundle /Application/B324E72E-2B5A-4A02-BC2C-FB542FDA6957/AppName.app/default.realm, NSUnderlyingError = 0x618000241bc0 {Error Domain = NSPOSIXErrorDomain Code = 2 "Нет такого файла или каталога"}}

У кого-нибудь есть идеи по этому поводу. Как минимум, путь до Users / username / Library / Developer / CoreSimulator / Devices / 4965D609-499A-4AE5-8ECC-3266DAE4BA87 / data / Containers / Bundle / Application / B324E72E-2B5A-4A02-BC2C-FB542FDA6957. /AppName.app/ существует, а затем файл содержится в пакете.


person Apocal    schedule 24.09.2016    source источник
comment
У кого-нибудь есть что-нибудь по этому поводу? К сожалению, я все еще застрял.   -  person Apocal    schedule 26.09.2016


Ответы (1)


Потому что вы путаете path и URL. Realm.Configuration.defaultConfiguration.fileURL возвращает экземпляр URL. Bundle.main.path() возвращает экземпляр String. Строковое представление URL не то же самое, что path.

e.g.

print(String(describing: defaultRealmPath))
// => file:///Users/.../Documents/default.realm

print(defaultRealmPath.path)
// => /Users/.../Documents/default.realm

Таким образом, вы должны использовать либо один (путь или URL). Если вы используете path, используйте defaultRealmPath.path вместо String(describing: defaultRealmPath), как показано ниже:

let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")

if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
    do
    {
        try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path)
    }
    catch let error as NSError {
        // Catch fires here, with an NSError being thrown
        print("error occurred, here are the details:\n \(error)")
    }
}

Если вы используете URL, Bundle.main.url() вместо Bundle main.path(): пусть defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!

let bundleReamPath = Bundle.main.url(forResource: "default", withExtension:"realm")!

if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
    do
    {
        try FileManager.default.copyItem(at: bundleReamPath, to: defaultRealmPath)
    }
    catch let error as NSError {
        // Catch fires here, with an NSError being thrown
        print("error occurred, here are the details:\n \(error)")
    }
}
person kishikawa katsumi    schedule 28.09.2016
comment
Большое спасибо, Кишикава - person Apocal; 29.09.2016