SQLite - целочисленное ограничение PRIMARY INDEX не выполняется? - PullRequest
0 голосов
/ 20 сентября 2018

В моем приложении для Android я создаю FULLTEXT таблицу, подобную этой:

CREATE VIRTUAL TABLE products USING fts3 (
    _id integer PRIMARY KEY,
    product_name text NOT NULL,
   ...
)

И я добавляю этот индекс:

CREATE INDEX product_name_index ON products (product_name)

Приложение заполняеттаблица с различными продуктами, каждый из которых имеет уникальное значение _id.

Однако, когда я затем пытаюсь вставить уже существующий идентификатор продукта (используя значение _id, которое уже есть в таблице, но сдругое значение product_name) вот так:

long rowId = db.insertOrThrow("products", null, contentValues);

a new строка добавлена ​​в таблицу (с совершенно новымrowId возвращаемое значение)!

Я ожидал, что команда insertOrThrow не удастся, так в чем же проблема?Это как-то связано с тем, что это таблица FULLTEXT, или индекс, указанный в столбце product_name, может как-то испортить ситуацию?

Я читал этот раздел о INTEGER PRIMARY KEY , но, к сожалению, я не мудрее.

Обновление

Когда я пытаюсь выполнить ту же операцию со стандартной (не FULLTEXT) таблицей, тоКоманда insertOrThrow приводит к ожидаемому SQLiteConstraintException.

1 Ответ

0 голосов
/ 20 сентября 2018

Я думаю, что проблема может заключаться в том, что таблица FTS имеет концепцию столбца docid и rowid , а указание значения NULL для docid приводит к тому, чтополучая значение.

согласно: -

Есть еще одно тонкое отличие между "docid" и обычными псевдонимами SQLite для столбца rowid.

Обычно, если инструкция INSERT или UPDATE назначает дискретные значения двум или более псевдонимам столбца rowid, SQLite записывает в базу данных самые правые значения, указанные в операторе INSERT или UPDATE.

Однако присвоение ненулевого значения как «docid», так и одному или нескольким псевдонимам строк SQLite при вставке или обновлении таблицы FTS считается ошибкой.Ниже приведен пример.

1.3.Заполнение таблиц FTS

...