2010-10-16 197 views
0

試用sqlite,我想用數據從數據庫初始化一個列表視圖。我的來源是這樣的:sqlite3_step返回代碼21 loadView

-(void) initTheList { 
sqlite3 *db; 
int rows = 0; 

const char* dbFilePathUTF8 = [searchTermDBLocation UTF8String]; 
int dbrc = sqlite3_open(dbFilePathUTF8, &db); 

// count 
if (dbrc) { 
    NSLog(@"Could not open the DB"); 
} else { 
    NSString *queryStatementNS = @"select count(*) from article"; 
    const char* queryStatement = [queryStatementNS UTF8String]; 

    sqlite3_stmt *dbps; 
    dbrc = sqlite3_prepare_v2(db, queryStatement, -1, &dbps, NULL); 

    if (sqlite3_step(dbps) == SQLITE_ROW) { 
     rows = sqlite3_column_int(dbps, 0); 
    } else { 
     NSLog(@"SQL step failed code: %d", sqlite3_step(dbps)); 
     NSLog(@"Attempted Query: %@", queryStatementNS); 
    } 

    [queryStatementNS release]; 
} 

if (rows > 1000) { ... } else { ... }; 
... 

其實我認爲一旦視圖加載後纔會調用代碼是一件好事。因此,我增加數組的初始化和方法調用:

- (void)loadView { 
    [super loadView]; 
    tableData = [[NSMutableArray alloc] initWithObjects:nil]; 
    [self initTheList]; 
} 

但是,這樣做,sqlite3_step返回X15(SQLITE_MISUSE 21/*庫正確* /使用)。如果我放置代碼來調用numberOfRowsInSection方法中的方法,則調用可以正常工作。

有人可以給我一個提示,我可以更多地瞭解生命週期和與sqlite數據庫的關係嗎?令我驚訝的是,我可以打開數據庫,但讀取失敗,而放置在明顯在稍後時間點調用的方法中的相同代碼可以正常工作。

+0

由於您正在嘗試使用SQLite,這意味着您是新手。除非您對SQLite有非常明確的需求,否則請改爲探索Core Data。編寫原始SQL通常是浪費時間。 – bbum 2010-10-16 16:06:11

+0

感謝您的建議,我將對Core Data進行調查。不過,我仍然感興趣的是爲什麼從sqlite數據庫中選擇數據在一種情況下工作,但不在另一種情況下。 – Sven 2010-10-18 10:55:43

回答

3

我剛剛遇到了錯誤代碼21問題(「庫使用不正確。」)我在Web上找不到任何有用的答案,我準備好斷定SQLite3中存在一些錯誤XCode中的庫。然後,終於,我發現我的問題:我的SQL中的一個微妙的錯字。

在INSERT或REPLACE語句中發生錯誤。但是這個特別的陳述本身沒有錯別字,所以我沒有找到我最長時間以來出錯的地方。數據庫文件正在創建,所以我運行了一個(Unix)字符串命令,並發現在創建表時,我在其中一個字段名稱中創建了一個拼寫錯誤。表創建正常,但與錯誤的字段名稱。當我正在執行INSERT OR REPLACE時,我正在使用正確的字段名稱。啊!不匹配導致了錯誤。

我不知道這是否是您的問題;但是在創建SQL語句時很容易犯一個錯字,而且這些錯誤並不總是很容易追蹤(正如我今天下午向自己演示的那樣)。如果我是你,我會仔細檢查你的每一個陳述。

希望這會有所幫助!