2016-04-15 7 views
7

Ich bin ziemlich neu in der Entwicklung von ios.Swift Realm, laden Sie die vorgefüllte Datenbank auf die richtige Weise?

Ich folge dieser migration example vorausgefüllt Datenbank zu verwenden und den Code ein wenig

hier ist ich auf AppDelegate -> func application

let defaultPath = Realm.Configuration.defaultConfiguration.path! 
    let path = NSBundle.mainBundle().pathForResource("default", ofType: "realm") 

    if let bundledPath = path { 

     print("use pre-populated database") 
     do { 
      try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
      try NSFileManager.defaultManager().copyItemAtPath(bundledPath, toPath: defaultPath) 

     } catch { 
      print("remove") 
      print(error) 
     } 
    } 

verwenden, um die endgültige Code ändern Ich teste diese in einem realen Gerät .

Es funktioniert, aber nach der Codelogik wird es immer auf die vorbelegte Datenbank zurückgesetzt werden. Dies wird bestätigt: Die Daten werden nach dem Neustart der App zurückgesetzt.

Ich versuchte moveItemAtPath anstelle von copyItemAtPath. Berechtigungsfehler

Ich habe versucht, die vorher gefüllte Datenbankdatei nach der Kopie zu löschen. Berechtigungsfehler

Ich habe versucht, die vorher ausgefüllte Datenbankdatei als Realm-Standardkonfigurationspfad zu verwenden. Fehler tritt auch auf.

Antwort

1

Ja, Ihre Logik ist richtig. Jedes Mal, wenn dieser Code ausgeführt wird, wird die Standard-Realm-Datei im Documents-Verzeichnis gelöscht und durch die statische Kopie ersetzt, die mit dem App-Bundle geliefert wurde. Dies wird im Realm-Beispielcode entworfen, um den Migrationsprozess bei jedem Start der App zu demonstrieren.

Wenn Sie möchten, dass dies nur einmal passiert, wäre es am einfachsten, vorher zu überprüfen, ob eine Realm-Datei bereits im Standardpfad vorhanden ist, und dann die Kopie nur dann auszuführen, wenn dies nicht ist schon da. :)

let alreadyExists = NSFileManager.defaultManager().fileExistsAtPath(defaultPath) 

if alreadyExists == false && let bundledPath = path { 
    print("use pre-populated database") 
    do { 
     try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
     try NSFileManager.defaultManager().copyItemAtPath(bundledPath, toPath: defaultPath) 

    } catch { 
     print("remove") 
     print(error) 
    } 
} 
+0

oh, ja, wäre dies ein Weg sein. BTW, es ist 'fileExistsAtPath' – Jesse

+0

@TiM warum' file exists 'immer wahr zurückgibt? – aaisataev

+0

@aaisataev Sobald die Datei erstellt wurde, ist es nicht erforderlich, denselben Ersetzungscode erneut auszuführen. Es macht also Sinn, dass es nach dem ersten Mal immer "wahr" ist. :) – TiM

7

In Swift 3.0, versuchen Sie dies:

let bundlePath = Bundle.main.path(forResource: "default", ofType: "realm") 
    let destPath = Realm.Configuration.defaultConfiguration.fileURL?.path 
    let fileManager = FileManager.default 

    if fileManager.fileExists(atPath: destPath!) { 
     //File exist, do nothing 
     //print(fileManager.fileExists(atPath: destPath!)) 
    } else { 
     do { 
      //Copy file from bundle to Realm default path 
      try fileManager.copyItem(atPath: bundlePath!, toPath: destPath!) 
     } catch { 
      print("\n",error) 
     } 
    } 
+0

Sind Sie sicher, dass sich "Realm.Configuration.defaultConfiguration.fileURL? .path" in den zukünftigen Realm-Versionen nicht ändert? –

+0

Ich bin mir nicht sicher, dass es in der Zukunft nicht geändert wird, aber es funktioniert jetzt gut (Realm 2.5.1) –

+0

@LuanVoThanh Warum 'Datei existiert' gibt immer wahr zurück? – aaisataev

Verwandte Themen