Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android棒棒糖-SQLite的行为改变_Android_Sqlite_Backwards Compatibility_Android 5.0 Lollipop - Fatal编程技术网

Android棒棒糖-SQLite的行为改变

Android棒棒糖-SQLite的行为改变,android,sqlite,backwards-compatibility,android-5.0-lollipop,Android,Sqlite,Backwards Compatibility,Android 5.0 Lollipop,在测试我的一个应用程序与Android 5.0的兼容性时,我发现我的两个SQL查询在棒棒糖上不再像预期的那样工作。我的这两个问题导致了棒棒糖与旧版本Android相比的显著不同的结果 下面,我将更深入地描述这些问题及其解决方案,以防您遇到类似问题 我的主要问题很简单:这些不向后兼容的更改是否有文档记录 问题一:匹配 以下查询似乎不再适用于棒棒糖: SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH

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

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

我的主要问题很简单:这些不向后兼容的更改是否有文档记录

问题一:匹配 以下查询似乎不再适用于棒棒糖:


SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH '*ads*');
Error: no such column: inner.title 它不再返回任何结果,在棒棒糖制作之前(当然是使用相同的数据库和数据)

例如,如中所述,MATCH仅匹配字符串前缀。事实上,在Android<5.0上,搜索词前面的“*”被忽略了

然而,棒棒糖的SQLite不喜欢第一个“*”,并且不会为此查询返回任何内容。我必须将查询更改为以下内容才能再次运行:


SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH 'ads*');
(我使用FTS3进行全文搜索。)

问题二:校对本地化 短篇故事:通过使用Android特定的“COLLATE LOCALIZED”将原始名称引用的别名列与订单组合在一起,会在棒棒糖上引发错误,但在以前的版本中有效。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, '*') AS title2
FROM 
    (SELECT types.text AS title FROM types) AS inner
GROUP BY inner.title 

ORDER BY title2 COLLATE LOCALIZED ASC
上述查询适用于Andriod<5.0,但会导致棒棒糖出错:


SELECT title FROM ents JOIN ctt ON ctt.docid = ents.cttId WHERE (ctt MATCH '*ads*');
Error: no such column: inner.title (顺便说一句,您可以在中找到Android中使用的SQLite版本的详细概述)

现在有一个有趣的部分:如果在ORDER BY子句中删除了特定于Android的“COLLATE LOCALIZED”,那么即使使用“groupby inner.title”,一切也会开始工作:

我的棒棒糖体验基于SDK模拟器中使用Android 5.0-API Level 21 ARM系统映像的测试

这个secon问题在我看来像是Android特有的SQLite bug。或者有人能解释我这种奇怪的行为吗?或者,再说一遍,这是否有记录在案?:-)


提前谢谢

无论如何,我都不是SQLite专家,我想您打算让这个问题主要是修辞性的,但请允许我提供一些想法

匹配 正如您已经指出的,
匹配
。用星号作为前缀(如果愿意的话)会出现意外和不可预测的行为,这并不奇怪

用别名整理本地化的 这似乎是一个有趣的bug。不过,您可以尝试使用
解释查询计划
对其进行诊断

文档 显然,我没有告诉你任何你还不知道的事情。然而,您的“问题”是关于文档的。首先,这是一个问题。他们通常对版本之间的更改非常详细

您的第一个问题实际上是编程错误。关于如何使用FTS前缀的文档已经存在。你不会得到解释为什么你的特定语法停止工作。可以说,它一开始就不应该奏效

本地化的
问题很可能是一个bug,因此它缺乏“文档”(不过我鼓励你向谷歌报告)。还要记住,SQLite是Android核心的一部分,它不仅具有定制功能(如本地化的
),还具有本机Java绑定。基础SQLite核心实现和绑定都可能随着每个版本而改变。这就引出了我的主要观点:


考虑使用私有SQLite实现部署应用程序。请按说明进行操作。这将使您能够控制应用程序使用的SQLite版本,并使您能够很好地控制升级的方式和时间。但是,这确实是有代价的,例如,您丢失了
本地化的
关键字,而且我相信绑定只支持API 15或更高版本。

我发现OP存在一些问题

  • FTS使用百分比而非星号作为通配符

  • FTS在单词边界上搜索,因此拥有领先的通配符从未对FTS起作用,它会将通配符传递给sqlite,以非常慢的速度读取整个表格,但OP让我们相信它在过去确实起作用。因此,如果这个查询真的运行,那么它在过去运行得很慢

  • 联合查询使用的资源量总是过多,尤其是与某些group by组合时。因此,此查询在可扩展业务应用程序中没有位置


  • 观察到的变化是因为棒棒糖附带了SQLite 3.8(Android 4.x附带了3.7.11)。以下是更改列表


    例如,“GROUP BY INTERNAR.title”中没有此类列的错误是由于“GROUP BY子句中的标识符始终首选输出列名”。

    .1。你把
    FTS MATCH
    SQL-LIKE混为一谈了
    我读了文档。也许我没有错。你应该把文档和你的评论联系起来。FTS进行单词边界搜索。理论上,3.8应该可以将SQLite性能提高50%。实际上,在棒棒糖升级后,由于某种原因,我的查询时间翻了一番,真是难以忍受。我不明白为什么他们会改变一些行为,不让它与旧版本兼容。如果某个查询在某个版本中“正常工作”,那么它根本无法在新版本中中断!同样值得在Android 5.1和6.0上进行测试,这两个版本都附带了不同的SQLite版本