¿Cómo agregar una nueva columna a la base de datos SQLite de Android?

Tengo un problema con la SQLite datos SQLite Android.

Tengo una tabla que contiene un campo.StudentFname y esa aplicación funciona bien con Android 2.3.1 y ahora si agrego otro campo, entonces mi aplicación no funciona correctamente.

¿Alguien puede ayudarme a que sepa la base de datos muy bien,

puede usar la función ALTER TABLE en su método onUpgrade() , como este:

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

Obviamente, el SQLite diferirá dependiendo de la definición de la columna.

La forma más sencilla de hacerlo es agregar algo de SQL to the onUpgrade() método SQL to the onUpgrade() en su SQLiteOpenHelper class . Algo como:

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

Encontré este hilo cuando necesitaba ayuda en mi propia aplicación, pero vi problemas con muchas de las respuestas. Yo recomendaría hacer lo siguiente:

 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); } } 

Desea asegurarse de que el código funcione cuando los usuarios actualicen más de una versión y que la instrucción de actualización solo ejecute la actualización que se necesita. Para un poco más sobre esto, mira este blog .

Tal vez un enfoque un poco más elegante usando el interruptor en lugar de si / entonces que se actualizará de cualquier esquema al esquema más reciente …

Aquí también hay una página decente sobre la syntax para alterar una tabla: 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 } } 

@ Aamirkhan.i creo que habrías resuelto el problema que mencionaste en los comentarios hace mucho tiempo. Creo que no has aumentado la versión de la base de datos. O bien, las respuestas aquí son directas. Estoy escribiendo esto porque podría ayudar a cualquiera que no haya aumentado o cambiado su número de versión de la base de datos cuando están alterando una tabla.

Creo que no deberíamos verificar una condición así

  if (newVersion > oldVersion) { } 

porque si usamos esto, significa que cada vez que aumentemos la versión de la base de datos, entonces onUpdrade () llamará y la condición será verdadera, por lo que deberíamos verificar de esa manera

 if(oldVersion==1) { } 

entonces en este caso si la versión anterior es 2, entonces la condición será falsa y el usuario con la versión anterior 2 no actualizará la base de datos (que el usuario solo quiere para la versión 1), porque para esos usuarios la base de datos ya se había actualizado.

He hecho el siguiente acercamiento, se ha resuelto para mí

si la versión DB: 6

 Ex : There is a table with 5 columns 

Cuando actualizas a: 7 (agrego 1 nueva columna en las 3 tablas)

  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); } 

Donde: "DATABASE_ALTER_ADD_PAPER_PAID" es consulta.

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

Después de las dos operaciones anteriores, funcionará bien para el usuario de instalación reciente y el usuario de la actualización de la aplicación

Para agregar una nueva columna a la tabla, debe usar ALTER . En Android, puedes agregar la nueva columna dentro de onUpgrade() .

Puede que se pregunte, ¿cómo onUpgrade() agregará la nueva columna?

Cuando implemente una subclase de SQLiteOpenHelper , deberá llamar al constructor de superclase: super(context, DB_NAME, null, 1); en tu constructor de clase Ahí he pasado 1 para la versión.

Cuando cambié la versión 1 a la anterior ( 2 o superior), se invoca onUpgrade() . Y realice las modificaciones SQL que pretendo hacer. El constructor de mi clase después de haber cambiado la versión:

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

Comprobaciones de modificaciones de SQL como esta, el constructor de superclase compara la versión del archivo db SQLite almacenado con la versión que pasé a super() . Si estos números de versión (anterior y ahora) son diferentes, se invoca onUpgrade() .

El código debería verse así:

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

Encontré un enlace mientras buscaba el mismo problema. Explica cómo usar la actualización. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

explica por qué usar este código a continuación

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

La forma más fácil de crear una nueva columna en una tabla es agregar SQL al método onUpgrade () en la clase SQLiteOpenHelper. Me gusta:

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

Simplemente cambie su código

private final int DATABASE_VERSION = 1;

a

private static final int DATABASE_VERSION = 2;