Подтвердить что ты не робот

База данных 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? Я так думаю, потому что я не обновлял свой код до и после обновления этой ОС.

4b9b3361

Ответ 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 для этого столбца, это предупреждение исчезло.