Tengo un problema con la SQLite
base de datos de 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, mi aplicación no funciona correctamente.
¿Alguien puede ayudarme que conozca muy bien la base de datos?
Me encontré con este hilo cuando necesitaba ayuda con mi propia aplicación, pero vi problemas con muchas de las respuestas. 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 declaración de actualización solo ejecute la actualización necesaria. Para obtener más información sobre esto, consulte este blog .
fuente
La forma más sencilla de hacer esto es agregar algún
SQL to the onUpgrade()
método en suSQLiteOpenHelper 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"); } }
fuente
Quizás un enfoque un poco más elegante usando switch en lugar de if / then que se actualizará desde cualquier esquema al esquema más reciente ...
Aquí también hay una página decente sobre 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 } }
fuente
He hecho el siguiente enfoque, está resuelto para mí.
si la versión DB: 6
Ex : There is a table with 5 columns
Cuando actualiza a: 7 (estoy agregando 1 nueva columna en las 3 tablas)
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 nueva y el usuario de actualización de la aplicación
fuente
@ Aamirkhan.i creo que habría resuelto el problema que mencionó en los comentarios hace mucho tiempo. Creo que no aumentó la versión de la base de datos. De lo contrario, las respuestas aquí son sencillas. Estoy escribiendo esto porque podría ayudar a cualquiera que no haya aumentado o cambiado el número de versión de su base de datos cuando esté alterando una tabla.
fuente
Creo que no deberíamos comprobar una condición así.
porque si usamos esto, significa que cada vez que aumentemos la versión de la base de datos, onUpdrade () llamará y la condición será verdadera, por lo que deberíamos verificar así
entonces, en este caso, si la versión anterior es 2, la condición será falsa y el usuario con la versión anterior 2 no actualizará la base de datos (que el usuario desea solo para la versión 1), porque para esos usuarios la base de datos ya se había actualizado.
fuente
Para agregar una nueva columna a la tabla, debe usar
ALTER
. En Android, puede agregar la nueva columna dentro deonUpgrade()
.Quizás se pregunte, ¿cómo
onUpgrade()
agregará la nueva columna?Cuando implementas una subclase de
SQLiteOpenHelper
, necesitas llamar al constructor de superclase:super(context, DB_NAME, null, 1);
en tu constructor de clases. Allí he pasado1
por la versión.Cuando cambié la versión
1
anterior (2
o superior),onUpgrade()
se invocará. Y realizar las modificaciones SQL que pretendo hacer. Mi constructor de clases después de cambiar la versión:Las modificaciones de SQL verifican como esta, el constructor de superclase compara la versión del archivo db SQLite almacenado con la versión a la que pasé
super()
. Si estos números de versión (anteriores y actuales) son diferentes,onUpgrade()
se invoca.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"); } }
fuente
Simplemente cambie su código
a
fuente
Encontré el enlace mientras buscaba el mismo problema. Explica cómo utilizar la actualización. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
explica por qué usar este código a continuación
fuente
La forma más fácil de crear una nueva columna en una tabla es agregar algo de 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"); } }
fuente