2014-09-22 21 views
-2

我有以下sqllite代碼:SQLLite錯誤 - 無法打開DB

func createAndCheckDatabase()-> Bool 
{ 
    var success: Bool = true 

    var db:COpaquePointer = nil  // Get path to DB in Documents directory 
    let docDir:AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 

    let path = docDir.stringByAppendingPathComponent("MyDatabase.db") 
    // Check if copy of DB is there in Documents directory 
    let fm = NSFileManager.defaultManager() 
    if !(fm.fileExistsAtPath(path)) { 
     // The database does not exist, so copy to Documents directory 
     let from = NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent(databaseName) 
     var error:NSError? 
     if !fm.copyItemAtPath(from, toPath: path, error: &error) { 
      //ALWAYS ERRORS HERE THE FIRST TIME 
      println("SQLiteDB - #1 failed to open DB.") 
      println("Error - \(error!.localizedDescription)") 
     } 
    } 

    databasePath = path 
    // Open the DB 
    let cpath = (path as NSString).UTF8String 
    let error = sqlite3_open(cpath, &db) 
    if error != SQLITE_OK { 
     // Open failed, close DB and fail 
     println("SQLiteDB - another error - couldn't open DB") 
     sqlite3_close(db) 
    } 

    return success 
} 

我打電話給我的應用程序委託中此功能與思想,它會成功創建我的數據庫一次(也是唯一一次)。每當我清除設置並運行它時,它總是會打到我標記過的區域(錯誤)一次。再次運行後,我再也不會遇到這個錯誤。

這段代碼是否存在一些邏輯瑕疵(我主要複製了這段代碼)還是我可能報告了一個實際上不是的錯誤?我懷疑它可能只會在第一次創建時發生,但我確實沒問題,並且可以開始與數據庫進行交互。

也有人看到有關代碼中的東西?

謝謝!

回答

0

好,沒有真正搞清楚爲什麼上面的代碼鵝卵石從網上教程在一起,我描述的那樣後,我發現這裏一個非常有用的文章:

http://metrozines.com 

這最終解決我的問題(按照如何他們做了一些事情並從教程中介紹了代碼)。現在,當我清除設置時,它不會崩潰,並且再次啓動它可以正常工作而不會引發錯誤。

的作品現在的代碼是這樣的:

func createAndCheckDatabase() -> Bool { 
    let DATABASE_RESOURCE_NAME = "abc" 
    let DATABASE_RESOURCE_TYPE = "sqlite" 
    let DATABASE_FILE_NAME = "abc.sqlite" 
    let documentFolderPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 

    let dbfile = "/" + DATABASE_FILE_NAME; 

    self.dbFilePath = documentFolderPath.stringByAppendingString(dbfile) 

    let filemanager = NSFileManager.defaultManager() 
    if (!filemanager.fileExistsAtPath(dbFilePath)) { 

     let backupDbPath = NSBundle.mainBundle().pathForResource(DATABASE_RESOURCE_NAME, ofType: DATABASE_RESOURCE_TYPE) 

     if (backupDbPath == nil) { 
      return false 
     } else { 
      var error: NSError? 
      let copySuccessful = filemanager.copyItemAtPath(backupDbPath!, toPath:dbFilePath, error: &error) 
      if !copySuccessful { 
       println("copy failed: \(error?.localizedDescription)") 
       return false 
      } 

     } 

    } 

    return true 

} 
+0

這是不是一個實際的答案。如果您實際上發佈了代碼修補而不是鏈接,那將會更有幫助。 – rmaddy 2014-09-22 01:52:31

+0

好的,謝謝我加了它。 – NullHypothesis 2014-09-22 02:29:14