web-dev-qa-db-fra.com

La base de données SQLite donne un index automatique d'avertissement sur <table_name> (colonne) Après la mise à niveau Android L

J'ai mis à jour mon Nexus 7 avec Android 5.0 Lollipop, Avant cela, mon application fonctionnait bien avec Base de données SQLite mais maintenant Chaque fois que j'exécute n'importe quel type de requête, cela me donne - log cat error 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 donc une erreur de toute erreur de sucette? Je pense que oui car je n'ai pas mis à jour mon code avant et après la mise à niveau de ce système d'exploitation.

41

Indexation automatique a été introduit dans sqlite 3.7.17. Une version de sqlite avec cette fonctionnalité n'était que incluse dans Android L aperçu du développeur . C'est pourquoi vous obtenez le message uniquement sur Lollipop mais pas plus tôt. Même s'il est enregistré comme une erreur, c'est vraiment juste un message.

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

Pensez à ajouter des index 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 d'indexation automatique produits par sqlite.

Si vous souhaitez simplement récupérer l'ancien comportement, vous pouvez désactiver l'indexation automatique avec

PRAGMA automatic_index=off;
70
laalto

C'était le poste le plus haut pendant que j'examinais ce problème. Bien que j'ai un projet C # et qu'il ne soit peut-être pas pertinent pour l'OP, je pensais qu'il pourrait toujours ê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; votre requête utilise peut-être un classement différent.

J'avais un tableau avec une colonne de texte et une requête de sélection avec une instruction where spécifiant where name = @var1 COLLATE NOCASE. Cela a déclenché les avertissements, car l'index que j'avais créé était le classement par défaut.

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

1
user1515791