2014-02-06 238 views
1

我想從我的數據庫中獲取數據,但我有一些問題。如何從SQLite數據庫檢索值

這裏是我的代碼:

NSString *action=[[NSString alloc]init]; 
NSString *queryStatement = [NSString stringWithFormat:@"SELECT ACTIONNAME FROM ACTIONS WHERE ACTIONSYMBOL = '%@'", symbol]; 

// Prepare the query for execution 
sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(database, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK) 
{ 
    // Create a new address from the found row 
    while (sqlite3_step(statement) == SQLITE_ROW) { 
     action = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]; // fails on this line 
    } 
    sqlite3_finalize(statement); 

    return action; 
} 

(參數符號來自外部的)

當我運行它,它在與調用stringWithUTF8Stringsqlite3_column_text結果行失敗。

+2

我建議你使用FMDatabase框架 - 這對於sqlite來說是一個很好的包裝。 – etolstoy

回答

0

在您致電sqlite3_column_text時,您使用的索引爲1,但它需要一個從零開始的索引。使用0而不是1。見SQLite sqlite_column_XXX documentation,它說:

結果集的最左邊的列的索引爲0


順便說一句,因爲stringWithUTF8String如果你傳遞一個NULL值拋出一個異常,在繼續之前,如果sqlite3_column_text不是NULL,那麼檢查結果通常更安全,否則將優雅地處理錯誤。此外,您可能需要檢查sqlite3_stepsqlite3_prepare_v2錯誤,像這樣:

NSString *queryStatement = [NSString stringWithFormat:@"SELECT ACTIONNAME FROM ACTIONS WHERE ACTIONSYMBOL = '%@'", symbol]; // note, it can be dangerous to use `stringWithFormat` to build SQL; better to use `?` placeholders in your SQL and then use `sqlite3_bind_text` to bind the `symbol` value with the `?` placeholder 

if (sqlite3_prepare_v2(database, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK) 
{ 
    int rc; 
    while ((rc = sqlite3_step(statement)) == SQLITE_ROW) { 
     const unsigned char *value = sqlite3_column_text(statement, 0); // use zero 

     if (value) { 
      NSString *action = [NSString stringWithUTF8String:(const char *)value]; 

      // now do whatever you want with `action`, e.g. add it to an array or what 
     } else { 
      // handle the error (or NULL value) gracefully here 
     } 

     // make sure to check for errors in `sqlite3_step` 

     if (rc != SQLITE_DONE) 
     { 
      NSLog(@"%s: sqlite3_step failed: %s", __FUNCTION__, sqlite3_errmsg(database)); 
     } 
    } 
} 
else 
{ 
    NSLog(@"%s: sqlite3_prepare_v2 failed: %s", __FUNCTION__, sqlite3_errmsg(database)); 
} 

另外,如上述所示,正確執行所有錯誤檢查的是一個有點麻煩。這是FMDB可能是有用的,簡化以上(其中db是已經開了一個FMDatabase對象):

FMResultSet *rs = [db executeQuery:@"SELECT ACTIONNAME FROM ACTIONS WHERE ACTIONSYMBOL = ?", symbol]; 
if (!rs) { 
    NSLog(@"%s: executeQuery failed: %@", __FUNCTION__, [db lastErrorMessage]); 
    return; 
} 

while ([rs next]) { 
    NSString *action = [rs stringForColumnIndex:0]; 

    // do whatever you want with `action` here 
} 

[rs close]; 

如果您使用?佔位符(而不是使用stringWithFormat建立你的SQL,這是危險的)使用FMDB的好處更加引人注目。

+0

之後的行失敗謝謝!!!!就是這樣! – user3245831

2

你可能想收集的NSMutableArray結果:

NSMutableArray *action = [[NSMutableArray alloc] init]; 
... 

while (sqlite3_step(statement) == SQLITE_ROW) { 
    [action addObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)]]; 
} 

... 

然後,您可以看到什麼,後來收集:

for (NSString *s in action) { 
    NSLog(@"%@", s); 
} 

編輯正如@羅布的回答,指出第一列是0,而不是1

+0

沒有結果只有一個數據 – user3245831

+0

你爲什麼認爲他會得到乘數值?我想,你錯了。 – etolstoy

+0

@ user3245831那麼爲什麼'while'循環呢? – trojanfoe