使用 FTS3/4 Table 基于 Select 普通语句 Table

Using FTS3/4 Table based on Select Statements from Normal Table

在我的应用程序中,我在 Android 中开发,我有一个名为 Transactions 的 Sqlite Table,具有以下字段:

_Id | Date | Value | Notes

我已经有一个 ListView 显示按日期过滤的结果(例如):

Select * FROM Transacions WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'

它工作正常,但我想实现一个 SearchView 来搜索字段 Notes 中自定义日期之间的交易,一些文本在 SearchView 中键入。 我阅读了有关添加 SearchView 的信息,实现搜索的最佳方法是使用 FTS3 或 FTS4 Table,例如,允许用户键入 "SUPERMARKET" 并找到 Notes 包含此文本的事务. 问题的出现是因为 FTS table 执行 WHERE 条件的速度很慢(如上,过滤日期)...

如何使用 WHERE date BETWEEN ... and ... 过滤日期,并使用 FTS Table 的性能过滤文本注释?

Select * FROM Transacions WHERE (Date BETWEEN '2016-04-25' AND '2016-05-14) AND Notes LIKE '%text%''?

不要将 FTS table 视为 table,而是将其视为索引。

注释索引如下:

CREATE VIRTUAL TABLE Transactions_FTS USING FTS4(Notes);

您必须确保两个 table 的 ID 匹配,然后可以像这样组合 table:

SELECT *
FROM Transactions
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'
  AND _Id IN (SELECT docid
              FROM Transactions_FTS
              WHERE Notes MATCH 'supermarket');

或者这个:

SELECT *
FROM Transactions
JOIN Transactions_FTS ON Transactions._Id = Transactions_FTS.docid
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'
  AND Transactions_FTS.Notes MATCH 'supermarket';

(如果您关心使用的存储量,请考虑 external content FTS table。)