2012-04-09 128 views
2

從sqlite3數據庫讀取時遇到一些問題。無法從sqlite3數據庫中選擇

-(void) readMessengesFromDatabase { 
    sqlite3 *database; 

    messenges = [[NSMutableArray alloc] init]; 

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     NSLog(@"Connection OK"); 
     const char *sqlStatement = "select * from MessagesData"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE"); 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { //не проходит условие 
      NSLog(@"Connection to table OK"); 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       NSLog(@"Read rows OK"); 
       NSString *dbMessageID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
       NSString *dbMessageText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
       NSString *dbMessageDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 
       NSString *dbMediaOrNot = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 

       Message *messege = [[Message alloc] initWithName:dbMessageText messageID:dbMessageID messageDate:dbMessageDate mediaOrNot:dbMediaOrNot]; 

       [messenges addObject:messege]; 

       [messege release]; 
      } 
     } 
     sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database);  
} 

我的第一個NSLog告訴我什麼連接到數據庫是好的。但下一步「選擇*從MessagesData」和if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE");顯示我「連接到表FALSE」。嘗試從我的數據庫的表whith終端,並得到錯誤「無法打開數據庫文件」。我的錯誤在哪裏?我在代碼中看不到任何問題...

+1

您選擇不使用核心數據的原因嗎? – wlangstroth 2012-04-09 11:44:39

+0

或者至少FMDB? – Eugene 2012-04-09 11:49:34

+0

我會很樂意使用核心數據,但我的編程水平很低,但尚未使用它:) – RomanHouse 2012-04-09 11:52:10

回答

2

如果您打印由sqlite3_prepare_v2返回的錯誤代碼,則診斷問題將會容易得多。數字值可在this page上找到。

int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL); 
if(errorCode != SQLITE_OK) { 
    NSLog(@"Connect to table failed: %d", errorCode); 
} 

但是,如果你甚至無法從數據庫中sqlite3命令行工具選擇,我建議你檢查文件是否存在,是可讀的,正確的格式。

嘗試在您的模擬器中重現錯誤(例如,使用管理器將數據庫文件複製到您的計算機)。嘗試運行查詢使用sqlite3(我知道你確實嘗試過,但請確保你正在檢查以下內容)。

如果您收到消息Error: file is encrypted or is not a database,則表示數據庫文件已損壞。如果您獲得Error: no such table:,這意味着您的數據庫不存在,爲空,或者根本沒有該表。如果你得到(如你的問題):Error: unable to open database(你在sqlite打開期間得到這個,而不是在執行查詢時),這意味着sqlite無法讀取文件(例如權限)。

+0

我的錯誤代碼是「1」。它會是什麼?缺少數據庫?試圖運行我的舊版本的項目,他們有相同的錯誤(但它以前工作!)。 – RomanHouse 2012-04-09 17:30:25

+0

你確定該文件存在於此路徑嗎? '[[NSFileManager defaultManager] fileExistsAtPath:databasePath]'會告訴你 – Krumelur 2012-04-09 19:11:11

+0

剛剛檢查過。文件存在。 – RomanHouse 2012-04-09 19:16:40

0

寫一個代碼來檢查表是否存在。並在你執行查詢之前選擇你應該檢查創建表如果不存在....

NSLog(@「Connection OK」);

sqlite3_exec(database,"CREATE TABLE IF NOT EXISTS MessagesData (ID INTEGER PRIMARY KEY AUTOINCREMENT ," 
          "FirstName TEXT,LastName TEXT")); 

    const char *sqlStatement = "select * from MessagesData"; 

如果它的工作,請喜歡

1

嗯,我猜UR數據庫不能夠連接。 試試我的回答Here ...

我這裏所說的一些東西,我相信ü會就好了

讓我知道它的工作

+0

試過你的方式。它沒有顯示任何錯誤。 – RomanHouse 2012-04-09 17:49:36

+0

另外我試圖運行我的舊版本的項目,他們有同樣的錯誤,但他們以前工作。也許它可能是xCode或模擬器錯誤? – RomanHouse 2012-04-09 17:57:46