2017-09-08 3 views
0

これは私の最初のDBプロジェクトですので、私はいくつかの問題に直面しています。うまくいけばあなたは私を助けることができる! 私はFMDBを使用して既存のDBにアクセスしています。私が "Select * From films"のようなsimpelクエリを実行しようとすると、 "no such table"のようなものが返されます。私はIPhone Simulatorのフォルダを見て、DBを見つけましたが、それは空でした。私の次のステップは、このメソッドを含めることでした:即時開始後にデータベースをコピー

func copyDatabaseIfNeeded() { 
    // Move database file from bundle to documents folder 

    let fileManager = FileManager.default 

    let documentsUrl = fileManager.urls(for: .documentDirectory, 
             in: .userDomainMask) 

    guard documentsUrl.count != 0 else { 
     return // Could not find documents URL 
    } 

    let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("foo.db") 

    if !((try? finalDatabaseURL.checkResourceIsReachable()) ?? false) { 
     print("DB does not exist in documents folder") 

     let documentsURL = Bundle.main.resourceURL?.appendingPathComponent("foo.db") 

     do { 
      try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path) 
     } catch let error as NSError { 
      print("Couldn't copy file to final location! Error:\(error.description)") 
     } 

    } else { 
     print("Database file found at path: \(finalDatabaseURL.path)") 
    } 
} 

しかし、このメソッドは動作しません。私はDidFinishLaunchingから電話しています。

これは、エラーメッセージは次のとおりです。

私は間違った方法を使用していますかが間違って実装されている()

OverBurned/Library/Developer/CoreSimulator/Devices/B5EAE004-A036-4BD5-A692-C25EF3875D25/data/Containers/Bundle/Application/5ABA8D38-7625-4F98-83E9-4266A3E5B6B0/GameOne.app/foo.db, NSUnderlyingError=0x600000053230 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}} 

+0

私はそれが簡単に代わりFMDBの私の最初のDBアプリのsqlite.swiftライブラリを使用することを発見しました。チェックアウトの価値があるかもしれません。 – Martheli

+0

あなたのエラーメッセージが投稿したコードと一致しません。そして、あなたは本当にオプションを適切に扱う方法をいくつか学習する必要があります。 – rmaddy

答えて

1

エラーはクリアです。あなたのアプリのリソースバンドルにはfoo.dbはありません。

投稿したコードには多くの問題があります。

  1. foo.dbへのパスを取得するコードは理想的なものではありません。
  2. あなたはオプションを正しく扱っていません。
  3. 変数名を改善する必要があります。例 - 第2のdocumentsURLは、 "Documents"フォルダを参照するURLを意味します。実際には、リソースバンドル内のファイルに対するURLです。
  4. NSErrorの必要はありません。ここで

私はこのコードを記述する方法を次のとおりです。

func copyDatabaseIfNeeded() { 
    // Move database file from bundle to documents folder 

    let fileManager = FileManager.default 

    guard let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } 

    let finalDatabaseURL = documentsUrl.appendingPathComponent("foo.db") 

    do { 
     if !fileManager.fileExists(atPath: finalDatabaseURL.path) { 
      print("DB does not exist in documents folder") 

      if let dbFilePath = Bundle.main.path(forResource: "foo", ofType: "db") { 
       try fileManager.copyItem(atPath: dbFilePath, toPath: finalDatabaseURL.path) 
      } else { 
       print("Uh oh - foo.db is not in the app bundle") 
      } 
     } else { 
      print("Database file found at path: \(finalDatabaseURL.path)") 
     } 
    } catch { 
     print("Unable to copy foo.db: \(error)") 
    } 
} 
+0

私はDBがデフォルトでコピーされると思っていました。私が間違っていることを知るには長い時間がかかりました。だから私はちょうど別の投稿からメソッドをコピーしました。それは私のではありません。しかし、おかげであなたのためにメソッド!私はそれを試みたが、エラーは悲しいことに同じです。そこに何か、私はチェックボックスのコピーを除いてDBをインポート中に探す必要がありますか? – OverBurned

+0

私が投稿したコードを使って、正確に何が起こるのですか?どのメッセージが表示されますか? – rmaddy

+0

オーバーバーン/ライブラリ/開発者/ CoreSimulator /デバイス/ B5EAE004-A036-4BD5-A692-C25EF3875D25 /データ/コンテナ/データ/アプリケーション/ C15B1423-7531-4F90-B726-AAB5528A656F/Documents/foo.db、NSUnderlyingError = 0x600000052300 {エラードメイン= NSPOSIXErrorDomainコード= 2「そのようなファイルまたはディレクトリはありません」}} () – OverBurned

関連する問題