Правильная проверка текстового столбца nil sqlite - PullRequest
2 голосов
/ 28 февраля 2009

У меня есть столбец строки sqlite, который назначен на строку. Мне нужно убедиться, что это не ноль, прежде чем назначить. Я делаю это:

char *isNil = sqlite3_column_text(selectstmt, 2);
if(isNil != nil){
  myName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];}

, который выдает предупреждение:

предупреждение: инициализация отбрасывает квалификаторы из целевого типа указателя

Как правильно это сделать?

1 Ответ

7 голосов
/ 28 февраля 2009

Вы получаете предупреждение, поскольку игнорируете const. API определен:

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

Вы назначаете возврат на символ *, поэтому вы отбрасываете const. Вот почему вы получаете предупреждение. Вы должны уважать const.

const unsigned char *isNil = ...

Я на самом деле не большой парень с объективной целью, но я считаю стилистически обычной практикой сравнивать примитивные типы с NULL, а не с nil. Также нет необходимости дважды вызывать column_text.

const char *columnText = (const char *)sqlite3_column_text(selectstmt, 2);
if(columnText != NULL)
{
    myName = [NSString stringWithUTF8String: columnText ];
}

Вы можете видеть выше, что я привел константный беззнаковый указатель на символ с константным указателем на символ. Вы должны убедиться, что знаете, когда отбрасываете предупреждение, что это правильно. В этом случае безопасно привести к подписанному символу. В общем, никогда не отбрасывайте const, поскольку тот, кто создал этот API, мог бы делать что-то, что требует от вас обработки данных как const.

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