Ok, avant de vous lancer dans de plus gros problèmes que vous devez savoir que SQLite est limitée sur la commande ALTER TABLE, elle permet add
et rename
ne pas supprimer/goutte qui est fait avec les loisirs de la table.
Vous devez toujours disposer de la nouvelle requête de création de table et l'utiliser pour la mise à niveau et le transfert des données existantes. Remarque: les méthodes onUpgrade en exécutent une pour votre objet d'assistance sqlite et vous devez gérer toutes les tables qui s'y trouvent.
Alors ce qui est recommandé onUpgrade:
- beginTransaction
- exécuter une création de table avec
if not exists
(nous faisons une mise à niveau, de sorte que le tableau pourrait existe pas encore, il échouera aussi modifier et supprimer)
- mettre dans une liste les colonnes existantes
List<String> columns = DBUtils.GetColumns(db, TableName);
- table de sauvegarde (
ALTER table " + TableName + " RENAME TO 'temp_" + TableName
)
- créer un nouveau tableau (le plus récent tableau de schéma de création)
- obtenir l'intersection avec les nouvelles colonnes, ces colonnes de temps pris de la table mis à jour (
columns.retainAll(DBUtils.GetColumns(db, TableName));
)
- restaurer les données (
String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName));
)
- supprimer table de sauvegarde (
DROP table 'temp_" + TableName
)
- setTransactionSuccessful
(Cela ne gère pas downgrade de table, si vous renommez une colonne, vous ne recevez pas les données existantes transférées que les noms ne correspondent pas à la colonne).
.
public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
List<String> ar = null;
Cursor c = null;
try {
c = db.rawQuery("select * from " + tableName + " limit 1", null);
if (c != null) {
ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
}
} catch (Exception e) {
Log.v(tableName, e.getMessage(), e);
e.printStackTrace();
} finally {
if (c != null)
c.close();
}
return ar;
}
public static String join(List<String> list, String delim) {
StringBuilder buf = new StringBuilder();
int num = list.size();
for (int i = 0; i < num; i++) {
if (i != 0)
buf.append(delim);
buf.append((String) list.get(i));
}
return buf.toString();
}
Merci pour le détail! En ce moment j'ai juste besoin de quelque chose de simple, mais c'est génial! Je vais certainement l'utiliser à l'avenir! – Cameron