Ok, avant de vous lancer dans de gros problèmes, vous devriez savoir que SQLite est limitée sur la commande ALTER TABLE, il permet d' add
et rename
seulement de ne pas supprimer/supprimer ce qui est fait avec les loisirs de la table.
Vous devez toujours avoir la nouvelle création de la table de la requête à la main, et l'utiliser pour la mise à niveau et le transfert de toutes les données existantes. Remarque: notez que l'onUpgrade méthodes de pistes pour votre sqlite objet d'assistance et vous avez besoin pour gérer toutes les tables.
Quel est donc recommandé onUpgrade:
- beginTransaction
- exécuter une création de la table avec
if not exists
(nous faisons une mise à niveau, de sorte que le tableau pourrait n'existe pas encore, ce sera un échec alter et drop)
- 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 une table (la plus récente création de la table de schéma)
- obtenez de l'intersection avec les nouvelles colonnes, cette fois, les colonnes prises à partir de la mise à jour de la table (
columns.retainAll(DBUtils.GetColumns(db, TableName));
)
- la restauration des données (
String cols = StringUtils.join(columns, ",");
db.execSQL(String.format(
"INSERT INTO %s (%s) SELECT %s from temp_%s",
TableName, cols, cols, TableName));
)
- supprimez la sauvegarde de la table (
DROP table 'temp_" + TableName
)
- setTransactionSuccessful
(Ce n'est pas la poignée de la table de downgrade, si vous renommer une colonne, vous n'obtenez pas les données transférées noms de colonnes ne correspondent pas).
.
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();
}