База данных SQLite дает предупреждение об автоматическом индексе на <имя_таблицы> (столбец). После обновления Android L
Я обновил свой Nexus 7 с помощью Android 5.0 Lollipop, До этого мое приложение хорошо сочетается с SQLite Database, но теперь, когда я выполняю любой тип запроса, он дает мне log cat error как:
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)
Так что это ошибка любых ошибок Lollipop? Я так думаю, потому что я не обновлял свой код до и после обновления этой ОС.
Ответы
Ответ 1
Автоматическая индексация была введена в sqlite 3.7.17. Версия sqlite с этой функцией была только включенная в предварительный просмотр Android L. Вот почему вы получаете сообщение только на Lollipop, но не раньше. Даже если он зарегистрирован как ошибка, это действительно просто сообщение.
В принципе, автоматическая индексация вступает в игру, когда вы выполняете поиск по неиндексированным столбцам. sqlite предполагает, что так много данных, что генерация временного индекса дешевле, чем необработанный поиск.
Рассмотрим добавление явных постоянных индексов для ваших столбцов поиска с помощью CREATE INDEX
. Например, после CREATE TABLE
:
CREATE INDEX indexname ON tablename(columnname);
где вы можете выбрать tablename(columnname)
из сообщений autoindex, созданных sqlite.
Если вы просто хотите вернуть прежнее поведение, вы можете отключить автоиндексирование с помощью
PRAGMA automatic_index=off;
Ответ 2
Это был главный пост, когда я изучал эту проблему. Хотя у меня есть проект С#, и это может быть не актуально для OP, я думал, что он может быть полезен для кого-то.
Для тех, кто задается вопросом, почему сообщение продолжает появляться, хотя индекс был создан явно; возможно, ваш запрос использует другую сортировку.
У меня была таблица с текстовым столбцом и запрос выбора с инструкцией where, определяющей where name = @var1 COLLATE NOCASE
. Это вызвало предупреждения, так как индекс, который я создал, был по умолчанию.
Таким образом, переписывая либо индекс, либо оператор create table, чтобы указать nocase для этого столбца, это предупреждение исчезло.