Странное тестирование SQLite, если столбец был возвращен - PullRequest
0 голосов
/ 04 августа 2010

Полагаю, лучше всего показать код, который я делаю в результате:

Это работает:

if (sqlite3_column_text(statement, 0)) {
    [marker setObject:[NSNumber numberWithInt: sqlite3_column_int(statement, 0)] forKey:@"id"];
}

Всегда возвращает false для оператора if:

if (sqlite3_column_int(statement, 0)) {
    [marker setObject:[NSNumber numberWithInt: sqlite3_column_int(statement, 0)] forKey:@"id"];
}

Возвращает неверный результат для столбца:

if (sqlite3_column_text(statement, 0)) {
    [marker setObject:[NSNumber numberWithInt: sqlite3_column_text(statement, 0)] forKey:@"id"];
}

Есть идеи, что происходит?

1 Ответ

1 голос
/ 04 августа 2010

Вы должны получить количество возвращаемых столбцов, прежде чем пытаться получить доступ к значению столбца.

int count = sqlite3_column_count (statement);

При вызове sqlite3_column_int () возвращается целочисленное значение столбца.Что если это значение равно нулю?Вы не можете определить разницу между действительным нулевым результатом и нулевым значением для этого столбца.Вы можете проверить, имеет ли столбец значение NULL, с помощью

sqlite3_column_type () == SQLITE_NULL;

Кроме того, Obj-C не выполняет автоматическое преобразование различных типов, поэтому numberWithInt: sqlite3_column_text, конечно же, выдаст результаты мусора.Что возвращает sqlite3_column_text (), так это указатель на строку C, которая является адресом в памяти, где находится строка.Я предполагаю, что вы ожидаете, что это каким-то образом преобразует строку в целое число?Этого не происходит в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...