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

Tengo un problema con la base de datos SQLite de Android.

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

¿Puede alguien ayudarme que sabe base de datos muy bien,

Puede utilizar la función ALTER TABLE en su método onUpgrade() , así:

 @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 será diferente dependiendo de la definición de la columna.

La forma más sencilla de hacerlo es añadir algún 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"); } } 

Me encontré con 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 funcionará cuando los usuarios actualicen más de una versión y que la instrucción de actualización sólo ejecute la actualización que se necesita. Para un poco más sobre esto, echa un vistazo a este blog .

Tal vez un enfoque un poco más elegante utilizando el cambio en lugar de si / luego que se actualizará desde cualquier esquema al esquema más reciente …

Aquí también hay una página decente en la sintaxis 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ía resuelto el problema que mencionó en los comentarios de hace mucho tiempo atrás.yo creo que no aumentó 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 ha aumentado o cambiado su número de versión de base de datos cuando están alterando una tabla.

Creo que no deberíamos verificar condiciones como esa

  if (newVersion > oldVersion) { } 

Porque si usamos esto, significa que cada vez que aumentamos la versión de la base de datos, entonces onUpdrade () llamará y la condición será verdadera, por lo que debemos comprobar como eso

 if(oldVersion==1) { } 

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

Me encontré con enlace al buscar el mismo problema. Explica cómo utilizar la actualización. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

Explica por qué utilizar 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 añadir algún 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"); } } 

Para agregar una nueva columna a la tabla necesita usar ALTER . En android puede agregar la nueva columna dentro de la onUpgrade() .

Usted puede preguntarse, ¿cómo onUpgrade() agregará la nueva columna?

Al implementar una subclase de SQLiteOpenHelper , necesita llamar al constructor superclase: super(context, DB_NAME, null, 1); En el constructor de su clase. Allí he pasado 1 para la versión.

Cuando cambié la versión 1 por encima ( 2 o mayor), se onUpgrade() . Y realizar las modificaciones SQL que tengo la intención de hacer. Mi constructor de 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 SQL como ésta, constructor de superclases compara la versión del archivo db SQLite almacenado con la versión que pasé a super() . Si estos números de versión (anteriores y ahora) son diferentes, se invoca onUpgrade() .

El código debería tener este aspecto:

 @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"); } } 
  • Uso de la base de datos existente en Android Wear
  • Sqlite Añadir columna en la tabla en una posición determinada (Android)
  • Insertar TimeStamp en SQLite para Android
  • SQLite: Búsqueda eficiente de subcadenas en una tabla grande
  • Almacenamiento en caché de datos para aplicaciones móviles de iOS / Android para trabajar con Pagination
  • Android: Diseño de uno-a-muchos de SQLite
  • Problema sobre sqlite base de datos, no tal tabla:
  • ¿Cómo extender la clase SQLiteDatabase?
  • Android / SQLite: columnas de la tabla Insert-Update para mantener el identificador
  • Accede a la base de datos sqlite de Android desde el PC de desarrollo
  • Uso de SQLite desde libGDX en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.