2012-07-03 57 views
0

我在iOS應用程序中讀取數據庫中的某些數據。該功能是非常簡單的:iOS Sqlite3 SQLITE_ERROR

-(void) readCategories { 
    sqlite3 *database; 

    if([[NSFileManager defaultManager] fileExistsAtPath:databasePath]){ 
     if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
      const char *sqlStatement = "SELECT * FROM Categories ORDER BY name COLLATE NOCASE ASC"; 
      sqlite3_stmt *compiledStatement; 
      int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL); 

      if(errorCode == SQLITE_OK) { 
       while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
        [categories addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]]; 
       } 
      } else { 
       NSLog(@"Error reading categories. Code: %d, message: '%s'", errorCode,sqlite3_errmsg(database)); 
      } 
      sqlite3_finalize(compiledStatement); 
      sqlite3_close(database); 
     } else { 
      NSLog(@"Error opening DB"); 
     } 
    } else { 
     NSLog(@"DB does not exist."); 
    } 
} 

的問題是,錯誤碼爲始終SQLITE_ERROR根據文檔是:「SQL錯誤或丟失的數據庫」。給出的消息是:'沒有這樣的表:類別'

現在,如果我查看我的計算機上的數據庫文件,表格顯然存在。我也可以在其上運行完全相同的查詢,並且它可以正常工作。

有沒有人有什麼想法出錯?

謝謝。

+0

您確定databasePath中的文件是正確的數據庫文件嗎? –

+1

你應該使用sqlite3_errmsg(http://sqlite.org/c3ref/errcode.html)來查看出了什麼問題。 SQLITE_ERROR也意味着你的SQL是錯誤的。 – Stefan

+0

我已編輯我的帖子,更多信息。 –

回答

0

所以錯誤在於它沒有複製數據庫文件。我仍然不知道爲什麼它不是。幸運的是能夠以編程方式創建數據庫文件。這樣做解決了問題。不知道爲什麼該文件不會複製。

+0

我對嗎?你的問題解決了 – Deepesh

3

如果您在添加[[NSFileManager defaultManager] fileExistsAtPath:databasePath]檢查之前曾運行此代碼,則標準sqlite3_open將爲您創建一個空白數據庫,如果它沒有找到。所以,

  1. 通過模擬器菜單上的「重置內容和設置...」來重置您的模擬器。這將清除可能在過去創建的任何無關數據庫文件。 (如果您在設備上執行此操作,請刪除該應用程序然後重新安裝。)

  2. 如果找不到空白數據庫,sqlite3_open命令將會創建。爲了安全起見,在未來,使用sqlite3_open_v2代替,這將永遠不會創建一個空數據庫:

    if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 
        // handle opening error here 
    } 
    

    通過使用sqlite3_open_v2,這將確保數據庫絕不會在開放的過程中創建。

  3. 如果仍有問題,請導航到您計算機上的模擬器目錄,即「〜/ Library/Application Support/iPhone Simulator」。 (您可能需要通過在終端窗口中鍵入以下命令取消隱藏你的庫文件夾:

    chflags nohidden ~/Library 
    

    嘗試檢查數據庫出現(而不是在你的Xcode項目的版本),看看數據庫有所有的你需要的表格

  4. 如果在做完所有這些之後,你沒有看到你的數據庫被複制到你的模擬器/設備上,請確保你已經設置了目標的Build Phases設置,以便數據庫包含通過「複製捆綁資源」

  5. 正如其他人所建議的,當永遠你得到SQLITE_ERROR,總是通過像NSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));這樣的東西檢查出錯的細節。

+1

1)我正在使用設備,並且由於硬件限制只能使用設備。但是,我已經刪除了一切,因爲這確實發生了。 2)完成。 3)正如我所說的,使用硬件,所以這不會很不幸。 4)是的,這對我的項目是完全正確的。 5)是的,現在就使用它。 –

+0

@Velox如果數據庫沒有被拷貝過來,毫無疑問問題是#4,這將確保它是包的一部分。然後,您也可能希望讓應用程序將該文件複製到「文檔」文件夾,以便任何用戶更新都不會被未來的應用程序升級所淹沒。 – Rob