我使用带有matchinfo功能的SQLite FTS VIRTUAL TABLE查询,它工作得很好。查询如下:
SELECT
docid as _id,
KEY_NAME,
KEY_INDEX,
KEY_TEXT,
KEY_TRANS,
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
from FTS_VIRTUAL_TABLE
where KEY_TEXT MATCH '"\""+inputText+"\"*"+" ';
现在我必须在具有多个SELECT语句的同一个TABLE查询中实现matchinfo。但它崩溃了应用程序。我的代码如下:
SELECT
docid as _id,
KEY_NAME,
KEY_INDEX,
KEY_TEXT,
KEY_TRANS,
from FTS_VIRTUAL_TABLE
where docid in (
SELECT
docid
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES **//it does not work here also**
from FTS_VIRTUAL_TABLE
where KEY_TEXT MATCH '"\""+inputText+"\"*"+" '
union
SELECT
docid
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES **//nor here**
from FTS_VIRTUAL_TABLE
where KEY_TRANS MATCH '"\""+inputText+"\"*"+" ');
上面代码中注释的代码行导致App Crash。任何帮助将受到高度赞赏。谢谢!
修改
堆栈跟踪提供以下错误消息
android.database.sqlite.SQLiteException:只允许一个结果 对于作为表达式(代码1)的一部分的SELECT:同时 将SELECT docid编译为_id,KEY_NAME,kEY_INDEX,KEY_TEXT, KEY_TRANS,来自FTS_VIRTUAL_TABLE,其中docid(SELECT docid 十六进制(matchinfo(FTS_VIRTUAL_TABLE))AS KEY_OCCURRENCES来自 FTS_VIRTUAL_TABLE,其中KEY_TEXT MATCH'" \"" + inputText +" \" " +" ' union SELECT docid hex(matchinfo(FTS_VIRTUAL_TABLE))AS 来自FTS_VIRTUAL_TABLE的KEY_OCCURRENCES,KEY_TRANS MATCH '" \"&#34 + +的inputText" \" " +" &#39);
答案 0 :(得分:0)
问题是子查询的结构。当您使用SELECT获取要与IN进行检查的项目列表时,SLQ需要一个简单的1维结果(即{'a','b','c'})。由于内部SELECT查询中有多个术语,因此IN语句将获得复杂结果的列表(即{{'a',1},{'b',2},{'c',3}}) 。如果你想以这种方式使用内部SELECTS而你不需要matchinfo,你必须删除
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
来自内部SELECT查询的。如果你确实需要将matchinfo作为你的UNION的一部分(没有更多的上下文就很难分辨),那么你需要另一个子查询来包装整个UNION并只返回docid到顶级查询。像这样:
SELECT
docid as _id, KEY_NAME, KEY_INDEX, KEY_TEXT, KEY_TRANS,
from FTS_VIRTUAL_TABLE
where docid in (
--wrap the UNION so that only the docids are returned to the IN
SELECT docid from(
SELECT
docid
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
from FTS_VIRTUAL_TABLE
where KEY_TEXT MATCH '"\""+inputText+"\"*"+" '
union
SELECT
docid
hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
from FTS_VIRTUAL_TABLE
where KEY_TRANS MATCH '"\""+inputText+"\"*"+" '
)
);