При звонке в 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 еще более убедительны.
Я бы рекомендовал вам использовать фреймворк FMDatabase - это отличная оболочка для sqlite. – etolstoy