SQLite-整数PRIMARY INDEX约束失败?

时间:2018-09-20 18:47:51

标签: android sqlite android-sqlite

在我的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

1 个答案:

答案 0 :(得分:1)

我认为问题可能在于FTS表具有 docid rowid 列的概念,并为 docid 指定了null会得到一个值。

按照:-

  

“ docid”与正常值之间还有其他细微差别   rowid列的SQLite别名。

     

通常,如果是INSERT或UPDATE   语句将离散值分配给rowid的两个或多个别名   列,SQLite会在   对数据库执行INSERT或UPDATE语句。

     

但是,分配一个   “ docid”和一个或多个SQLite rowid的非NULL值   插入或更新FTS表时的别名被认为是   错误。参见下面的示例。

1.3. Populating FTS Tables