2015-11-04 71 views
1

將唯一值插入到虛擬表中我創建了一個虛擬table.i問題是我無法使用fts3將唯一值插入到我的虛擬表數據庫中。 這裏是我創建表的代碼如何使用(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聲明

回答

0

documentation說:

如果列名是作爲CREATE VIRTUAL TABLE語句的一部分爲FTS表顯式提供的,則可以爲每列選擇性地指定一個數據類型名稱。這是純粹的語法糖,所提供的類型名稱不被FTS或SQLite內核用於任何目的。這同樣適用於任何與FTS列名稱一起指定的約束 - 它們被解析但未被系統以任何方式使用或記錄。

而一個FTS表只能有效地處理全文搜索查詢。 它被用作索引,而不是表格。

如果您想要使用約束條件,則必須將數據存儲在「真實」表中,並僅將FTS表用於全文搜索。 (在這種情況下,你可能想使用一個external content table

+0

您可以使用我的代碼顯示嗎? – Jawa

0

就像這樣: 創建兩個表:

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

唯一鍵是在表2,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的主鍵將幫助您確定記錄的唯一性