Правильная проверка нулевого текстового столбца sqlite
У меня есть строковый столбец sqlite, который назначается строке. Перед назначением мне нужно убедиться, что он не равен нулю. Я делаю это:
char *isNil = sqlite3_column_text(selectstmt, 2);
if(isNil != nil){
myName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];}
который дает предупреждение:
предупреждение: инициализация отбрасывает квалификаторы из целевого типа указателя
Как правильно это делать?
Ответов (1)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.