92 votes

Comment ajouter une nouvelle colonne à la base de données Android SQLite ?

J'ai un problème avec la base de données Android SQLite .

J'ai une table qui contient un champ.StudentFname et cette application fonctionne correctement avec Android 2.3.1 et maintenant, si j'ajoute un autre champ, mon application ne fonctionne pas correctement.

Quelqu'un peut-il m'aider qui connaît très bien la base de données,

201voto

DevYudh Points 772

vous pouvez utiliser la fonction ALTER TABLE sur votre onUpgrade() , comme ceci :

 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}

Évidemment, le SQLite différera en fonction de la définition de la colonne.

33voto

PFranchise Points 1439

Je suis tombé sur ce fil lorsque j'avais besoin d'aide sur ma propre application, mais j'ai vu des problèmes avec la plupart des réponses. Je recommanderais de faire ce qui suit :

 private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}

Vous voulez vous assurer que le code fonctionnera lorsque les utilisateurs mettront à niveau plus d'une version et que l'instruction de mise à jour n'exécute que la mise à niveau nécessaire. Pour en savoir un peu plus à ce sujet, consultez ce blog .

23voto

user370305 Points 46287

Le moyen le plus simple de le faire est d'ajouter une SQL to the onUpgrade() dans votre SQLiteOpenHelper class . Quelque chose comme:

 @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    // If you need to add a new column
    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
    }
}

16voto

Edward Bagby Points 612

Peut-être une approche légèrement plus élégante utilisant le commutateur au lieu de if/then qui mettra à niveau de n'importe quel schéma vers le schéma le plus récent...

Voici également une page décente sur la syntaxe pour modifier une table : http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

 public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    switch (oldVersion)
    {
        case 1:
            //upgrade from version 1 to 2
            db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
        case 2:
            //upgrade from version 2 to 3
            db.execSQL(DATABASE_ALTER_TEAM_TO_V3);

        //and so on.. do not add breaks so that switch will
        //start at oldVersion, and run straight through to the latest

    }

}

5voto

sssvrock Points 31

J'ai fait l'approche suivante, elle est résolue pour moi

si version DB : 6

 Ex : There is a table with 5 columns

Lorsque vous passez à : 7 ( j'ajoute 1 nouvelle colonne dans les 3 tableaux)

  1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }

Où : "DATABASE_ALTER_ADD_PAPER_PAID" est la requête.

 EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

Après les deux opérations ci-dessus, cela fonctionnera correctement pour l'utilisateur de la nouvelle installation et l'utilisateur de la mise à niveau de l'application

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