3 votes

Meilleures pratiques pour les colonnes et les index Android SQLite

Je commence à utiliser SQLite dans mon application Android. Je ne suis pas novice en matière de bases de données, j'ai travaillé pendant de nombreuses années sur des bases de données avec Delphi, ce qui facilite un peu l'utilisation des bases de données.

Dans une application, on peut avoir un tableau avec plusieurs colonnes. Pour lire les données de la table, on exécute du SQL, puis on utilise un curseur pour accéder aux données.

Il existe plusieurs méthodes d'accès aux données par le curseur, l'une d'entre elles utilise l'index de la colonne dans la table - de nombreux exemples que j'ai vus sur le net utilisent cette méthode. Par exemple :

cursor.getString(3);

Avoir le "3" intégré dans le code n'est pas la meilleure idée, vous pouvez donc utiliser :

int idx = cursor.getColumnIndex( "THECOLUMNNAME" );
cursor.getString(idx);

Utiliser getColumnIndex() plus d'une fois pour une table et une colonne est un gaspillage. Conserver les constantes des index de ce qui pourrait être plusieurs dizaines ou centaines de colonnes est source d'erreurs.

Ma question est la suivante : quelle est la meilleure pratique pour faire ce genre de choses ?

Devrais-je étendre le curseur pour mieux représenter une table spécifique ?

Merci,

Mike

3voto

CL. Points 46451

Lorsque vous avez très peu de colonnes, et surtout lorsque ces colonnes n'ont pas de noms propres (comme SELECT MAX(x), MIN(x) FROM t ), l'utilisation d'index de colonnes fixes est parfaitement adaptée. C'est plus dangereux lorsqu'il est probable que le nombre/ordre des colonnes change ultérieurement, ou lorsqu'il y a une grande distance entre la requête et les accès au curseur dans le code source.

Si vous voulez éviter trop de getColumnIndex vous devez en effet mettre en cache la valeur de retour. Cela peut être rendu plus facile avec une classe d'enveloppe qui contient à la fois l'index de la colonne et une référence au curseur, comme ceci :

Cursor cursor = db.query(...);
Field foo = new Field(cursor, "FOO");
Field bar = new Field(cursor, "BAR");
while (cursor.moveToNext()) {
    foo.getString();
    bar.getInteger();
}

(L'implémentation de cette classe est laissée comme un exercice ...)

1voto

Dan Breslau Points 9217

Dans au moins certaines implémentations de Cursor, getColumnIndex itère à travers un tableau de noms de colonnes (cf. aquí pour un exemple). Si votre requête porte sur une table comportant un grand nombre de colonnes, vous voudrez peut-être mettre en cache les index des colonnes avant de parcourir en boucle les lignes du résultat.

Mais comme d'autres l'ont souligné dans les commentaires, un grand nombre de colonnes peut être le symptôme d'une mauvaise conception de la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X