sqlite3_bind_int(statement, 1, nil)
будет привязывать 0 к первой точке привязки, а не NULL.0 и NULL - это не одно и то же в SQL.
Я думаю, вы ищете sqlite3_bind_null
.Он связывает NULL с точкой привязки, например:
sqlite3_bind_null(statement, 1);
Здесь нет параметра для NULL;это имя функции.
Кроме того, для несвязанных параметров по умолчанию установлено значение NULL.Поэтому, если вы не используете sqlite3_reset
, вам вообще не нужно его использовать.
(Поскольку мы говорим о привязках и сбросах, я должен упомянуть sqlite3_clear_bindings
, который связывает все параметры в NULL.)
Задача 2
Вы обновили это, указав SIGABRT в строке NSString * f1.
Есть две проблемы с вашим кодом, которые я вижу:
sqlite3_column_text
на основе 0;первый столбец 0, а не 1. (Да, столбцы основаны на 0. Хотя привязки основаны на 1.)
char *field1 = (char *)sqlite3_column_text(statement, 1);
должно быть:
char *field1 = (char *)sqlite3_column_text(statement, 0);
sqlite3_column_text
может вернуть NULL
, если в данных содержится NULL
, но initWithUTF8String:
не принимает NULL
в качестве значения.
Я предлагаю сделать это:
NSString *f1 = field1 ? [[NSString alloc] initWithUTF8String:field1] : nil;
Используя это, вы получите ноль NSString
, если у вас в столбце будет NULL
.Вы можете принять решение по этому вопросу, и это просто сделать f1 ?: @""
, когда вам действительно нужна строка.
Другой подход - изменить запрос:
SELECT Field FROM Table;
На:
SELECT COALESCE(Field,'') FROM Table;
Вы больше не сможете определить, был ли Филд изначально NULL
, но, возможно, вам все равно.