在我的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(使用表中已经存在的_id
值,但具有不同的product_name
值)时,如下所示:
long rowId = db.insertOrThrow("products", null, contentValues);
新 行已添加到表中(返回了新的rowId
值)!
我期望insertOrThrow
命令失败,那么我哪里出错了?它是FULLTEXT表,还是在product_name
列上指定的索引可能以某种方式弄乱了事情?
我阅读了有关INTEGER PRIMARY KEY的这一部分,但不幸的是,我没有一个明智的选择。
更新
当我尝试在标准(非FULLTEXT)表上执行相同的操作时,insertOrThrow
命令将产生预期的SQLiteConstraintException
。
答案 0 :(得分:1)
我认为问题可能在于FTS表具有 docid 和 rowid 列的概念,并为 docid 指定了null会得到一个值。
按照:-
“ docid”与正常值之间还有其他细微差别 rowid列的SQLite别名。
通常,如果是INSERT或UPDATE 语句将离散值分配给rowid的两个或多个别名 列,SQLite会在 对数据库执行INSERT或UPDATE语句。
但是,分配一个 “ docid”和一个或多个SQLite rowid的非NULL值 插入或更新FTS表时的别名被认为是 错误。参见下面的示例。