2010-08-20 4 views

Répondre

6

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(); 
} 
+0

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

21

trouvé une solution

try { 
      db.execSQL("ALTER TABLE notes" + " ADD COLUMN Week"); 
     } catch (SQLException e) { 
      Log.i("ADD COLUMN Week", "Week already exists"); 
     } 
+0

+1 parce que c'est la solution simple à votre question simple –

Questions connexes