2016-04-15 20 views
7

Jestem całkiem nowy w rozwoju ios.Swift Realm, załaduj wstępnie wypełnioną bazę danych we właściwy sposób?

śledzę ten migration example użyć pre-zaludnionych bazy danych i zmienić kod trochę

Oto ostateczny kod używam na 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) 
     } 
    } 

jestem testowania tego w rzeczywistym urządzeniu .

Działa, ale zgodnie z logiką kodu, zawsze zostanie zresetowany do wstępnie wypełnionej bazy danych. Jest to weryfikowane: dane są resetowane po restarcie aplikacji.

Próbowałem moveItemAtPath zamiast copyItemAtPath. błąd uprawnień

Próbowałem usunąć wstępnie wypełniony plik bazy danych po skopiowaniu. błąd uprawnień

Próbowałem użyć wstępnie wypełnionego pliku bazy danych jako domyślnej ścieżki konfiguracji obszaru. Wystąpił również błąd.

Odpowiedz

1

Tak, twoja logika jest poprawna. Za każdym razem, gdy ten kod zostanie wykonany, domyślny plik dziedziny w katalogu dokumentów zostanie usunięty i zastąpiony statyczną kopią dostarczoną z pakietem aplikacji. Odbywa się to poprzez projektowanie w przykładowym kodzie Realm w celu zademonstrowania procesu migracji przy każdym uruchomieniu aplikacji.

Jeśli chcesz, aby tak się stało tylko jeden raz, najprościej to zrobić, to sprawdzić wcześniej, czy plik obszaru istnieje już w domyślnej ścieżce, a następnie wykonać kopię tylko wtedy, gdy nie ma ona wartości . już tam jest. :)

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 Tak, to byłoby to sposób. btw, to jest 'fileExistsAtPath' – Jesse

+0

@ TiM dlaczego' plik istnieje' zawsze zwraca true? – aaisataev

+0

@aaisataev Po utworzeniu pliku nie trzeba ponownie uruchamiać tego samego kodu zastępczego. Więc ma to sens, że po raz pierwszy zwróci wartość "true". :) – TiM

7

W Swift 3.0, spróbuj tego:

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

Czy jesteś pewien, że "Realm.Configuration.defaultConfiguration.fileURL? .path" nie zmieni się w przyszłych wersjach dziedziny? –

+0

Nie wiem, czy to nie będzie zmiana w przyszłości, ale na razie wszystko działa dobrze (Realm 2.5.1) –

+0

@LuanVoThanh dlaczego 'plik istnieje' zawsze zwraca true? – aaisataev

Powiązane problemy