2014-02-06 25 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; 
} 

(символ параметра извне)

Когда я запускаю это, она не в соответствии с вызовом stringWithUTF8String с sqlite3_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_step и sqlite3_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); 
} 

EDIT Как указано в @ ответ Роба, то первая колонка 0, а не 1.

+0

нет результата только в одном – user3245831

+0

Почему, по вашему мнению, он получит многозначные значения? Я думаю, неправильно. – etolstoy

+0

@ user3245831 Так почему же тогда цикл while? – trojanfoe

Смежные вопросы