2016-10-05 19 views
1
let file_url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil,create: false).appendingPathComponent("asd.db") 
var db:OpaquePointer? = nil 
if sqlite3_open(file_url.path, &db) == SQLITE_OK 
{ 
    print("Successfully opened connection database!!") 
    var q:OpaquePointer? = nil 
    if sqlite3_prepare_v2(db, "SELECT * FROM aaa", -1, &q, nil) == SQLITE_OK 
    { 
     if sqlite3_step(q) == SQLITE_ROW 
     { 
      let res = sqlite3_column_text(q, 1) 
      let name = String(cString: res!)   } 
     else 
     { 
      print("ERROR1!!!!!") 
     } 
    } 
    else 
    { 
     print("ERROR!2!!!!") 
    } 
} 

proejctに "asd.db"という名前のデータベースファイルがあり、データベースからデータを開いて読み込もうとしています。Swift3 sqlite3_open()既存のファイルを開く

なぜ私のデータベースファイルを見つけることができないのですか?sqlite3_openはなぜ私のデータベースファイルを見つけることができないのですか?

どうすれば修正できますか?むしろsqlite3_openより

+0

はどこにあなたの前の質問http://stackoverflow.com/questions/39861174/swift-sqlite3-prepare-v2に違いはありますか? –

+0

前の質問では関数sqlite_prepare_v2を扱いましたが、これはsqlite3_openを扱います –

+0

だから、これはhttp://stackoverflow.com/questions/39851956/swift-open-database-file-sqlite3ですか? –

答えて

3
  1. あなたは(SQLITE_OPEN_CREATEオプションSQLITE_OPEN_READWRITEではなく)、SQLiteのは、新しいデータベースを作成したいsqlite3_open_v2を使用しない場合。

  2. アプリを一度実行して、ドキュメントフォルダに空のデータベースがある場合は、アプリを削除して再インストールして空のデータベースを削除してください。

  3. 「プロジェクトに」データベースを追加した場合(それを問題のターゲットに追加したと仮定した場合)、データベースがバンドルに含まれることを意味します。

    標準的なプロセスでは、データベースがドキュメントフォルダに存在するかどうかを確認するルーチンを作成し、そうでない場合はドキュメントフォルダから開く前にバンドルからドキュメントフォルダにコピーします。

    また、ドキュメントフォルダで開いてみてください。ファイルが見つからないために失敗した場合は、バンドルからドキュメントフォルダにコピーしてもう一度やり直してください。たとえば:

    var db:OpaquePointer? = nil 
    
    /// Open database 
    /// 
    /// - returns: Return `true` if successful; return `false` on error. 
    
    func openDatabase() -> Bool { 
        do { 
         let manager = FileManager.default 
    
         let documentsURL = try manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("asd.db") 
    
         var rc = sqlite3_open_v2(documentsURL.path, &db, SQLITE_OPEN_READWRITE, nil) 
         if rc == SQLITE_CANTOPEN { 
          let bundleURL = Bundle.main.url(forResource: "asd", withExtension: "db")! 
          try manager.copyItem(at: bundleURL, to: documentsURL) 
          rc = sqlite3_open_v2(documentsURL.path, &db, SQLITE_OPEN_READWRITE, nil) 
         } 
    
         if rc != SQLITE_OK { 
          print("Error: \(rc)") 
          return false 
         } 
    
         return true 
        } catch { 
         print(error) 
         return false 
        } 
    } 
    
+0

私はあなたのコードに従って、それは働いている! ありがとう! –

関連する問題