¿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.
- Problemas para obtener Calendar.WEEK_OF_YEAR
- Uso correcto de Sqlite en Android (SQLiteOpenHelper, conexiones, hilo principal, etc ...)
- La restricción de Android Room FOREIGN KEY falló
- GreenDAO - clave primaria en varias columnas
- No se puede capturar Java (Android) Excepción con try-catch
¿Puede alguien ayudarme que sabe base de datos muy bien,
- No se puede realizar la operación porque no hay ninguna transacción actual al insertar en la base de datos
- Cómo almacenar datos desde un archivo XML a una base de datos SQLite en android
- Exportación de una base de datos SQLite a un archivo XML en Android
- Depurando ExpandableListView de la base de datos - no funciona
- InsertWithOnConflict () vs. Insertar o reemplazar
- SQLite Android asignación de la ventana de cursor de 2048 kb falló
- Sqlite restricción error código de error
- Eliminar fila de SQLite con cláusula where con cláusulas múltiples
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"); } }
- Valor de versión de usuario de AndroidManifest.xml en código
- OnActivityResult RESULT_OK no se puede resolver a una variable en android?