1

私の Android アプリは、SQLite FTS3 テーブルを使用して全文検索を提供しています。insertWithOnConflictwithを使用しCONFLICT_REPLACEてデータベースを更新し、必要に応じて新しい行を挿入したり、存在する場合は既存の行を更新したりしています。

テーブルに重複した行が含まれていることに非常に驚きましたが、これは SQLite の FTS モジュールの文書化された「機能」のようです。

SQLite FTS3 および FTS4 拡張機能ページから:

データ型と列の制約は、各列とともに指定されます。これらは FTS と SQLite では完全に無視されます。

コマンドラインから複製を複製するのはとても簡単です:

sqlite> CREATE VIRTUAL TABLE test_duplicates USING FTS3
   ...> (id INTEGER PRIMARY KEY, name TEXT);
sqlite> INSERT INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> INSERT INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> INSERT OR REPLACE INTO test_duplicates (id, name) VALUES (1, "George");
sqlite> SELECT * FROM test_duplicates;
1|George
1|George
1|George
sqlite>

私の質問は次のとおりCONFLICT_REPLACEです。

現時点での私の考えは、(A) SELECT を実行してから、結果に基づいて UPDATE または INSERT を実行するか、(B) 既存の行 (存在する場合と存在しない場合があります) をやみくもに DELETE してから INSERT を試みることです。

4

4 に答える 4

3

fts ドキュメントを参照すると、次の段落が見つかりました。

... 各 FTS テーブルには「rowid」列があります。FTS テーブルの行 ID は、通常の SQLite テーブルの行 ID 列と同じように動作しますが、VACUUM コマンドを使用してデータベースが再構築された場合、FTS テーブルの行 ID 列に格納されている値は変更されません。FTS テーブルの場合、通常の「rowid」、「oid」、および「 oid」識別子とともに、「docid」をエイリアスとして使用できます。テーブルに既に存在する docid 値を使用して行を挿入または更新しようとすると、通常の SQLite テーブルの場合と同様にエラーになります。

つまり、組み込みのdocid列を主キーとして使用し、fts テーブルにその制約を適用させることができます。

于 2012-11-12T10:59:54.257 に答える
0

私はこれを信用しません。しかし、これを取得した元のリンクが見つかりません。クエリを実行してから、次のようにします。

if (cursor.moveToFirst()) {
        // record exists
    } else {
        // record not found
于 2012-11-09T01:16:58.910 に答える