Правильная проверка нулевого текстового столбца sqlite

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

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

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

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

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

Ответов (1)

Решение

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

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

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

const unsigned char *isNil = ...

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

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

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