如何使用(fts3)将唯一值插入虚拟表

时间:2015-11-04 13:24:10

标签: android sqlite fts3

我创建了一个虚拟table.i问题是我无法使用fts3将唯一值插入到我的虚拟表数据库中。 这是我的创建表代码

 public static final String DATABASE_CREATE =
            "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + " USING fts3(" +
                    KEY_CUSTOMER + " text UNIQUE," +
                    KEY_NAME + " NOT NULL," +
                    KEY_ADDRESS1 + " NOT NULL," +
                    KEY_ADDRESS2 + " NOT NULL," +
                    KEY_CITY + " NOT NULL," +
                    KEY_STATE + " NOT NULL," +
                    KEY_ZIP + " NOT NULL," +
                    KEY_SEARCH + "," +
                    KEY_AMOUNT + " NOT NULL," +
                    " UNIQUE (" + KEY_CUSTOMER + "));"; 

这里我希望KEY_CUSTOMER是唯一的,它不起作用我可以多次存储同名...它忽略我的UNIQUE声明

2 个答案:

答案 0 :(得分:0)

documentation说:

  

如果作为CREATE VIRTUAL TABLE语句的一部分为FTS表显式提供了列名,则可以为每列选择性地指定数据类型名称。这是纯粹的语法糖,FTS或SQLite核心不会出于任何目的使用提供的类型名称。这同样适用于与FTS列名一起指定的任何约束 - 它们被解析但不被系统以任何方式使用或记录。

FTS表只能有效地进行全文搜索查询。 它既可以用作索引,也可以用作表格。

如果要使用约束,则必须将数据存储在“真实”表中,并仅将FTS表用于全文搜索。 (在这种情况下,您可能希望使用external content table。)

答案 1 :(得分:0)

就像这样: 创建两个表:

CREATE VIRTUAL TABLE IF NOT EXIST table1 USING fts3(content)
CREATE TABLE IF NOT EXIST table2(docid INTEGER, -Other Columns-)

唯一键在table2中,fts表只用于搜索 像这样嵌入sql

indexDB.beginTransaction();
INSERT INTO table1 (content) VALUES (?)
INSERT INTO table2 (docid, 'other columns') VALUES (last_insert_rowid(), ?)
indexDB.setTransactionSuccessful();
indexDB.endTransaction();
docid是两个表的外键。 table2的主键将帮助您使记录唯一