Android 基于普通表中的Select语句使用FTS3/4表

Android 基于普通表中的Select语句使用FTS3/4表,android,sqlite,full-text-search,Android,Sqlite,Full Text Search,在我的应用程序中,我正在Android中开发,我有一个名为Transactions的Sqlite表,其中包含以下字段: _Id | Date | Value | Notes 我已经有一个列表视图显示按日期筛选的结果,例如: 从日期介于“2016-04-25”和“2016-05-14”之间的交易中选择* 它工作得很好,但我想实现一个SearchView来搜索自定义日期之间的交易,在字段注释中,一些文本在SearchView中键入。 我读过关于添加SearchView的内容,实现搜索的最佳方法是使

在我的应用程序中,我正在Android中开发,我有一个名为Transactions的Sqlite表,其中包含以下字段:

_Id | Date | Value | Notes
我已经有一个列表视图显示按日期筛选的结果,例如:

从日期介于“2016-04-25”和“2016-05-14”之间的交易中选择*

它工作得很好,但我想实现一个SearchView来搜索自定义日期之间的交易,在字段注释中,一些文本在SearchView中键入。 我读过关于添加SearchView的内容,实现搜索的最佳方法是使用FTS3或FTS4表,例如,允许用户键入SUPERMARKET并查找Notes中包含此文本的事务。 出现此问题是因为FTS表在上述情况下执行速度较慢,无法过滤日期

我如何实现这两个过滤日期,使用WHERE-date-BETWEEN。。。和…,并使用FTS表的性能过滤文本注释


如果不可能这样做,使用以下查询是否是一个好主意:
从日期介于“2016-04-25”和“2016-05-14”之间的交易中选择*以及诸如“%text%”之类的注释不将FTS表格视为表格,而将其视为索引

注释索引如下:

CREATE VIRTUAL TABLE Transactions_FTS USING FTS4(Notes);
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');
您必须确保两个表的ID匹配,然后可以像这样组合表:

CREATE VIRTUAL TABLE Transactions_FTS USING FTS4(Notes);
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';

如果你关心所使用的存储量,那么考虑一个.< /P>这样的查询是个好主意——这将是非常缓慢的。即兴,加入或子选择可能是最好的选择,虽然我还没有玩过这个场景。谢谢回答!实际上,第二个选项似乎更适合我,但是我必须更改其他方法更新、插入。。。使用fts和正常表格。为了不改变我的代码,我在Activity中动态创建了一个fts,其中的数据在事务中过滤,所以当用户开始搜索某些文本时,实际上它使用的是fts匹配,但包含在between date中的值。。。从另一张桌子