2016-09-24 2 views
1

Swift Version 3.Swift Kopie der Realm-Datei - nicht funktioniert

ich auf dem Kopieren meine realm.default Datei in meine Anwendung beim Start arbeite, wenn es nicht so vorhanden ist, dass ich es als Teil der Verteilung verpacken . Die Datei muss veränderbar sein, also kopiere ich sie in das Dokumentenverzeichnis.

Leider bekomme ich einen Fehler, dass die Datei nicht existiert. Ich habe überprüft, dass die Pfade korrekt sind und dass die .app die Datei enthält.

Mit diesem gesagt, die Datei hat einen weißen Kreis mit einer Linie darauf (geben Sie keinen Typ) und sagt, dass ich es auf dieser Art von Mac nicht öffnen kann, wenn ich versuche, es zu öffnen. Ich kann den Inhalt sehen, indem ich Paketinhalt anzeigen anzeige und die Datei darin enthalten ist.

Text über ..

Im Folgenden finden Sie den Code aus meiner App Delegierter, der die Realm-Datei lädt:

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)") 
     } 
    } 
} 

Im Folgenden sind die Fehlermeldungen (für Kontext bolded):

Fehler aufgetreten, hier sind die Details: Fehler Domain = NSCOAErrorDomain Code = 4 "Die Datei" default.realm "existiert nicht." UserInfo = {NSSourceFilePathErrorKey = /Users/username/Library/Developer/CoreSimulator/Devices/4965D609-499A-4AE5-8ECC-3266DAE4BA87/data/Containers/Bundle/Application/B324E72E-2B5A-4A02-BC2C-FB542FDA6957/AppName.app /default.realm, NSUserStringVariant = ( Kopieren ), NSDestinationFilePath = Datei: /// Benutzer/Benutzername/Bibliothek/Entwickler/CoreSimulator/Geräte/4965D609-499A-4AE5-8ECC-3266DAE4BA87/Daten/Container/Daten/Anwendung /565716DD-E903-409F-B7C8-20154B0DF6BA/Documents/default.realm, NSFilePath =/Benutzer/Benutzername/Library/Entwickler/CoreSimulator/Geräte/4965D609-499A-4AE5-8ECC-3266DAE4BA87/data/Container/Bundle/Anwendung/B324E72E-2B5A-4A02-BC2C-FB542FDA6957/AppName.app/default.realm, NSUnderlyingError = 0x618000241bc0 {Fehlerdomäne = NSPOSIXErrorDomain Code = 2 "Keine solche Datei oder kein Verzeichnis"}}

Jeder hat dazu eine Idee. Zumindest der Pfad bis zu Benutzer/Benutzername/Library/Entwickler/CoreSimulator/Devices/4965D609-499A-4AE5-8ECC-3266DAE4BA87/data/Container/Bundle/Application/B324E72E-2B5A-4A02-BC2C-FB542FDA6957 /AppName.app/ existiert und dann ist die Datei im Paket enthalten.

+0

Hat jemand etwas dabei? Leider bin ich immer noch fest. – Apocal

Antwort

2

Weil Sie path und URL verwirren. Realm.Configuration.defaultConfiguration.fileURL gibt Instanz URL zurück. Bundle.main.path() gibt die Instanz String zurück. Eine String-Darstellung von URL ist nicht dasselbe wie path.

z.B.

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

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

Sie sollten also entweder einen (Pfad oder URL) verwenden. Wenn Sie path verwenden, verwenden defaultRealmPath.path stattdessen String(describing: defaultRealmPath) wie folgt aus:

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)") 
    } 
} 

Wenn Sie URL verwenden, Bundle.main.url() statt Bundle main.path(): lassen 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)") 
    } 
} 
+0

Vielen Dank Kishikawa – Apocal