Détecter si une table contient une colonne dans Android / SQLite
Question
J'ai une application sur le marché, et une mise à jour que je veux ajouter quelques colonnes à la base de données. Pas de problème jusqu'à présent. Mais je veux détecter si la base de données en cours d'utilisation est manquant ces colonnes, et les ajouter si tel est le cas. J'ai besoin que cela soit fait de façon dynamique et non pas seulement après la mise à jour vers la nouvelle version, car l'application est censée être toujours en mesure d'importer des bases de données plus anciennes. Normalement, je serais en mesure d'utiliser le PRAGMA requête, mais je ne suis pas sûr comment faire avec Android. Je ne peux pas utiliser execSQL car il est une requête, et je ne peux pas comprendre comment utiliser PRAGMA avec la requête () -. Fonction
Ofcourse je pouvais attraper des exceptions, puis ajouter la colonne, ou toujours ajouter les colonnes à chaque table avant que je commence à travailler avec, mais ce n'est pas une solution propre.
Cheers,
La solution
Pragma fonctionne. À titre d'exemple, je viens d'essayer sur un de mes Android App BDs.
sqlite> pragma table_info (userCommand);
cid name type notnull dflt_value pk
0 id INTEGER 0 1
1 description TEXT 0 0
2 message TEXT 0 0
Comme on peut le voir, il y a trois champs dans la table spécifiée. id, la description et le message.
dans votre application, utilisez quelque chose comme:
Cursor c = null;
c = RawQuery ("pragma table_info (userCommand)",null);
// if c has records and is not null then iterate through the records in search of your table name.
S'il vous plaît excuser le formatage pauvres.
Autres conseils
Cela peut être exagéré, mais vous pouvez sélectionner une seule ligne de votre table dans un curseur et utiliser Cursor.getColumnIndex ([nom de la colonne sous forme de chaîne]). Ceci renvoie -1 si elle n'existe pas.
Essayez d'utiliser PRAGMA
avec rawQuery()
au lieu de query()
.
Vous pourriez émettre la commande suivante et passer en revue les résultats et voir si votre colonne est répertorié.
pragma table_info(table_name);
Modifier Je ne l'ai jamais fait cela sur Android, mais je pense que cela devrait fonctionner