2016-04-15 8 views
7

私はios開発にかなり新しいです。Swift Realm、あらかじめ設定されたデータベースを正しくロードしますか?

私はここに少しに

を事前にデータベースを使用して、コードを変更するには、このmigration exampleに従うが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) 
     } 
    } 

に私が使用して最終的なコードは、私が実際のデバイスでこれをテストしていますです。

これは動作しますが、コードロジックによれば、事前に入力されたデータベースにリセットされます。これは確認されました。データはアプリの再起動後にリセットされます。

copyItemAtPathの代わりにmoveItemAtPathを試しました。パーミッションエラー

コピー後に、事前設定されたデータベースファイルを削除しようとしました。パーミッションエラー

領域のデフォルト設定パスとして事前入力済みのデータベースファイルを使用しようとしました。エラーも発生します。

答えて

1

ええ、あなたのロジックは正しいです。このコードが実行されるたびに、ドキュメントディレクトリ内のデフォルトのレルムファイルが削除され、アプリケーションバンドルに付属する静的コピーに置き換えられます。これは、アプリケーションが起動されるたびに移行プロセスを示すために、Realmサンプルコードで設計されています。

これを一度だけ実行したい場合は、Realmファイルが既定のパスに既に存在するかどうかを確認してから、が存在しない場合のみコピーを実行するのが最も簡単な方法です既にがあります。 :)

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

ああ、うん、これは方法だろう。 btw、 'fileExistsAtPath'です。 – Jesse

+0

@TiM' file exists'は常にtrueを返しますか? – aaisataev

+0

@aaisataevファイルが作成されたら、同じ置換コードを再度実行する必要はありません。それで、最初の後に常に「真」を返すのが理にかなっています。 :) – TiM

7

3.0スウィフトでは、これを試してみてください。

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

"Realm.Configuration.defaultConfiguration.fileURL?.path"は、今後のバージョンのレルムで変更されませんか? –

+0

将来は変更されないのか分かりませんが、今はうまくいきます(レルム2.5.1) –

+0

@LuanVoThanhなぜ 'file exists'が常にtrueを返しますか? – aaisataev

関連する問題