SQLite数据库在<table_name>(列)上给出警告自动索引升级Android L之后

我已经用Android 5.0 Lollipop升级了我的Nexus 7,在此之前,我的应用程序与SQLite数据库很好,但现在每当我执行任何types的查询,它给我日志猫错误,如:

12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on area(server_id) 12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on account(area_id) 12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on area(server_id) 12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on account(area_id) 12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on area(server_id) 12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on account(area_id) 12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id) 12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id) 

那么是否有任何棒棒糖的错误? 我想是的,因为我没有更新我的代码之前和之后升级这个操作系统。

自动索引是在sqlite 3.7.17中引入的。 具有此function的sqlite版本仅包含在Android L开发人员预览版中 。 这就是为什么你只能在棒棒糖上得到消息,而不是在早些时候。 即使它被logging为一个错误,这实际上只是一个消息。

基本上,当你在非索引列上进行查找时,自动索引就会起作用。 sqlite假定有这么多的数据,生成一个临时索引比原始查找便宜。

考虑使用CREATE INDEX为查找列添加显式的永久CREATE INDEX 。 例如,在你的CREATE TABLE

 CREATE INDEX indexname ON tablename(columnname); 

你可以从sqlite产生的autoindex消息中selecttablename(columnname)

如果您只想恢复旧的行为,则可以使用禁用自动索引function

 PRAGMA automatic_index=off; 

这是我看到这个问题的最高职位。 虽然我有一个C#项目 ,它可能不相关的OP,我认为这可能仍然是有帮助的人。

对于那些想知道为什么消息不断出现的人,虽然索引是明确创build的; 也许你的查询使用不同的sorting规则。

我有一个文本列和select查询与一个where语句指定where name = @var1 COLLATE NOCASE 。 这触发了警告,因为我创build的索引是默认sorting规则。

因此,重写索引或创build表语句,为该列指定nocase,使警告消失。