使用 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。)
在我的应用程序中,我在 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。)