web-dev-qa-db-fra.com

Comment ajouter une nouvelle colonne à Android SQLite Database?

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

J'ai une table qui contient un field.StudentFname et cette application fonctionne bien 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,

75
Aamirkhan

vous pouvez utiliser la fonction ALTER TABLE sur votre méthode 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");
  }
}

De toute évidence, le SQLite différera en fonction de la définition de la colonne.

176
DevYudh

Je suis tombé sur ce fil lorsque j'avais besoin d'aide pour ma propre application, mais j'ai constaté des problèmes avec de nombreuses 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 un peu plus à ce sujet, consultez ceci blog .

23
PFranchise

Pour ce faire, la méthode la plus simple consiste à ajouter une méthode 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");
    }
}
22
user370305

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

Voici également une page décente sur la syntaxe pour modifier un tableau: 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

    }

}
13
Edward Bagby

Je pense que nous ne devrions pas vérifier la condition comme ça

 if (newVersion > oldVersion) {
 }

parce que si nous utilisons cela, cela signifie que chaque fois que nous augmentons la version de la base de données, onUpdrade () appellera et la condition sera vraie, nous devrions donc vérifier comme cela

if(oldVersion==1) 
{

}

donc dans ce cas, si l'ancienne version est 2, la condition sera fausse et l'utilisateur avec l'ancienne version 2 ne mettra pas à jour la base de données (cet utilisateur ne veut que pour la version 1), car la base de données de ces utilisateurs a déjà été mise à jour.

3
Himanshu arora

@ Aamirkhan.i pense que vous auriez résolu le problème que vous avez mentionné dans les commentaires il y a longtemps. Je pense que vous n'avez pas augmenté la version de la base de données. ou bien les réponses sont directes. Je vous écris ceci car cela pourrait aider les personnes qui n’ont pas augmenté ou changé le numéro de version de leur base de données lorsqu’elles modifient une table.

3
dora

J'ai fait la démarche suivante, elle est refaite pour moi

si version DB: 6

Ex : There is a table with 5 columns

Lorsque vous effectuez une mise à niveau vers: 7 (j'ajoute une 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 une 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, tout fonctionnera correctement pour l'utilisateur nouvellement installé et l'utilisateur de la mise à niveau de l'application.

2
sssvrock

Pour ajouter une nouvelle colonne à la table, vous devez utiliser ALTER. Dans Android, vous pouvez ajouter la nouvelle colonne à l'intérieur de la onUpgrade().

Vous vous demandez peut-être comment onUpgrade() ajoutera la nouvelle colonne?

Lorsque vous implémentez une sous-classe de SQLiteOpenHelper, vous devez appeler le constructeur de la superclasse: super(context, DB_NAME, null, 1); dans le constructeur de votre classe. Là j'ai passé 1 Pour la version.

Lorsque j'ai changé la version 1 En version supérieure (2 Ou supérieure), onUpgrade() sera invoquée. Et effectuez les modifications SQL que je compte faire. Mon constructeur de classe après avoir changé la version:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

Les modifications SQL vérifient de la sorte, le constructeur de la superclasse compare la version du fichier de base de données SQLite stocké à la version que j’ai transmise à super(). Si ces numéros de version (précédents et actuels) sont différents, onUpgrade() est appelé.

Le code devrait ressembler à ceci:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // add new columns to migrate to version 2
    if (oldVersion < 2) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
    }
    // add new columns to migrate to version 3
    if (oldVersion < 3) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
    }
}
1
Blasanka

Le moyen le plus simple de créer une nouvelle colonne sur une table consiste à ajouter du code SQL à la méthode onUpgrade () de la classe SQLiteOpenHelper. Comme:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
            db.execSQL(SQL_MY_TABLE);

        case 2:
            db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
    }
}
0
Digvij Borda

Je suis tombé sur un lien en cherchant le même problème. Il explique comment utiliser la mise à niveau. https://thebhwgroup.com/blog/how-Android-sqlite-onupgrade

cela explique pourquoi utiliser ce code ci-dessous

 @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);
        }
    }
0
Anand

Changez simplement dans votre code

private final int DATABASE_VERSION = 1;

à

private static final int DATABASE_VERSION = 2;

0
Shahzad Ahmad