小编Mic*_*ier的帖子

Android Lollipop - 改变了SQLite的行为

在测试我的Android 5.0兼容应用程序时,我发现了这一点 我的两个SQL查询 在棒棒糖上不再按预期工作了.与旧的Android版本相比,我的两个问题导致Lollipop的结果显着不同.

下面,我将更深入地描述这些问题及其解决方案,以防您遇到类似问题.

我的主要问题很简单:这些非向后兼容的变更是否记录在案?

问题一:MATCH

似乎以下查询在Lollipop上不再起作用:


SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH '*ads*');
Run Code Online (Sandbox Code Playgroud)

它不再返回任何结果,在它之前的Lollipop上(当然使用相同的数据库和相同的数据).

例如,如本问题所述,MATCH仅匹配字符串前缀.事实确实如此,搜索词前面的'*'在Android <5.0时被忽略了.

然而,Lollipop的SQLite不喜欢第一个'*',并且不会为此查询返回任何内容.我不得不将查询更改为以下内容以使其再次起作用:


SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH 'ads*');
Run Code Online (Sandbox Code Playgroud)

(我使用FTS3进行全文搜索.)

问题二:COLLATE LOCALIZED

简短的故事: GROUPing BY由原始名称引用的别名列与ORDER BY一起使用特定于Android的"COLLATE LOCALIZED"会在Lollipop上引发错误,但适用于以前的版本.WTF!?:-)

很长的故事:

故事开始于一个非常大的自动生成的查询,因此我修改,简化并缩短了导致问题的部分.我知道查询没有多大意义,如下所示,但它证明了问题.


SELECT 
    inner.title AS title, 
    ltrim(inner.title, '*') AS title2
FROM 
    (SELECT types.text AS title FROM types) AS inner
GROUP BY inner.title 

UNION SELECT 
    inner.title AS title, 
    ltrim(inner.title, …
Run Code Online (Sandbox Code Playgroud)

sqlite android backwards-compatibility android-5.0-lollipop

22
推荐指数
1
解决办法
3664
查看次数