Android: вставка записи sqlite с АВТОИНКРЕМЕНТНЫМ столбцом

#android #sqlite

#Android #sqlite

Вопрос:

У меня есть база данных sqlite на Android, созданная следующим образом:

 sqlite> .schema
CREATE TABLE criterion ('_id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, active text, important text, sort int, summary text, user text, category_id int, entrytype int);
  

Единственный способ, которым я могу вставить запись в эту таблицу, — это указать значение для _id, которое я хочу автоматически увеличить. Это единственный способ заставить вставку работать:

 recid = totalrecs   1;
String q = "insert into criterion (_id, active, important, sort, summary, user, category_id, entrytype) values ("   recid   ", "1", "0", 99, "foobar", "1", 99, 0)";
Log.d (TAG, "query:"   q);
mDb.execSQL (q);
  

Если я не использую столбец _id и не указываю значение для _id, я получаю сообщение об ошибке:

 android.database.sqlite.SQLiteConstraintException: criterion._id may not be NULL: insert into criterion(active, important, sort, summary, user, category_id, entrytype) values ("1", "0", 99, "foobar", "1", 99, 0)
  

Как мне упорядочить запрос (или схему), чтобы Android позаботился об увеличении столбца _id?

Обновление / исправлено на 2 строки выше (удалено NOT NULL, удален _id из запроса):

 CREATE TABLE criterion ('_id' INTEGER PRIMARY KEY AUTOINCREMENT, active text, important text, sort int, summary text, user text, category_id int, entrytype int);

String q = "insert into criterion (active, important, sort, summary, user, category_id, entrytype) values ("1", "0", 99, "foobar", "1", 99, 0)";
  

Комментарии:

1.eek вам действительно следует рассмотреть возможность использования SQLiteDatabase insert метода, а не создания этих необработанных строковых операторов

2. Согласен. Это громоздкий код, однако обстоятельства не позволили использовать альтернативный метод. Кроме того, любой, кто следит за этой темой, должен быть предупрежден о том, что несанкционированный пользовательский ввод в инструкции SQL insert, как показано выше, является причиной вопиющего «eek».

Ответ №1:

Удалите NOT NULL из схемы, и вы в выигрыше.

Уточнение: указание NOT NULL в столбце автоматического увеличения приводит к тому, что автоматическое увеличение не работает. Значение NOT NULL — это то, что делает это так, что вы должны указать _id .

Как только вы удалите ее и не включите _id в инструкцию insert, SQL получит _id как NULL и автоматически обработает настройку _id для вас.

Комментарии:

1. Большое спасибо, я столкнулся с аналогичной проблемой, и ваше решение помогло мне двигаться дальше. Однако я должен признать, что удаление NOT NULL в таком случае на удивление неочевидно.