La base de données SQLite donne l'avertissement index automatique sur (colonne) après la mise à niveau Android L

j'ai mis à niveau mon Nexus 7 avec Android 5.0 Lollipop, avant que mon application va bien avec base de données SQLite mais maintenant chaque fois que j'exécute un type de requête, il me donne log Cat erreur comme:

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)

est-ce une erreur d'une erreur de sucette? Je pense que oui parce que je n'ai pas mis à jour mon code avant et après la mise à jour de cet OS.

38
demandé sur Pratik Butani 2014-12-09 10:14:55

2 réponses

l'indexation automatique a été introduite en sqlite 3.7.17. Une version de sqlite avec cette fonctionnalité était seulement inclus dans Android l developer preview . C'est pourquoi vous obtenez le message seulement sur Lollipop mais pas plus tôt. Même si c'est enregistré comme une erreur, c'est juste un message.

fondamentalement, l'indexation automatique entre en jeu lorsque vous faites des recherches sur des colonnes non indexées. sqlite suppose qu'il y a tant de données que générer un indice temporaire est moins cher que la recherche brute.

envisagez d'ajouter des indices explicites et permanents pour vos colonnes de recherche avec CREATE INDEX . Par exemple, après votre CREATE TABLE :

CREATE INDEX indexname ON tablename(columnname);

où vous pouvez choisir tablename(columnname) dans les messages autoindex produits par sqlite.

si vous voulez simplement récupérer l'ancien comportement, vous pouvez désactiver l'auto-indexation avec

PRAGMA automatic_index=off;
66
répondu laalto 2017-05-23 12:09:42

C'était le top post pendant que j'étais à la recherche dans ce problème. Bien que j'ai un projet C# et il pourrait ne pas être pertinente pour l'OP, j'ai pensé qu'il pourrait encore être utile pour quelqu'un.

pour ceux qui se demandent pourquoi le message continue d'apparaître, bien qu'un index ait été créé explicitement; peut-être que votre requête utilise une collation différente.

j'ai eu une table avec une colonne de texte et une requête select avec une instruction where en spécifiant where name = @var1 COLLATE NOCASE . Cela a déclenché les Avertissements, car l'index que j'avais créé était la collation par défaut.

Ainsi, la réécriture de l ' index, ou l'instruction create table, pour spécifier nocase pour cette colonne, fait l'avertissement disparaît.

1
répondu user1515791 2017-06-21 15:48:25