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

82

Tengo un problema con la SQLitebase 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?

Aamirkhan
fuente

Respuestas:

188

puedes usar la ALTER TABLEfunción en tu onUpgrade()método, 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 diferirá según la definición de la columna.

DevYudh
fuente
1
¡Hola! He intentado esto, lo he usado en el método de actualización y dentro de eso también he puesto la consulta de la tabla alter. pero todavía no puedo agregar una nueva columna a la base de datos ... pero ya cuando escribo una consulta para agregar una nueva columna y renombrar la base de datos y el nombre de la tabla tanto de lo que puedo agregar una nueva columna ... pero con la ayuda del método alter table no puedo hacerlo ... cambiar la base de datos y la tabla no es la tarea deseada ... debería estar trabajando con alter table ... todavía no puedo hacerlo con el método alter table ..
Aamirkhan
@NagarjunaReddy lo siento por la respuesta tardía. puede usar este método db.execSQL ("ACTUALIZAR la tabla SET key = key + 1 WHERE name =?", new String [] {name});
DevYudh
3
No olvide aumentar la versión de la base de datos; de lo contrario, no se llamará a onUpgrade (). Aumente el número de versión en el siguiente código, que estará presente en el constructor de la clase que extiende la clase SQLiteOpenHelper. super (contexto de contexto, nombre de cadena, fábrica de CursorFactory, int newVersion)
appdroid
La aplicación se congela y tengo muchos mensajes como este en log cat: El grupo de conexiones para la base de datos '+ datos + usuario + 0 + com ..._ db' no ha podido otorgar una conexión al hilo 1 (principal) con banderas 0x5 para. ¿Por qué pasó esto?
Mahdi
29

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 .

PFranquicia
fuente
¿Qué hacer si queremos crear una columna alterada con el valor de cadena predeterminado?
shridutt kothari
22

La forma más sencilla de hacer esto es agregar algún SQL to the onUpgrade()método 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");
    }
}
user370305
fuente
He intentado esto, pero todavía no puedo agregar una nueva columna utilizando el método de alterar la tabla en el método de actualización.
Aamirkhan
¡Hola! He intentado esto, lo he usado en el método de actualización y dentro de eso también he puesto la consulta de la tabla alter. pero todavía no puedo agregar una nueva columna a la base de datos ... pero ya cuando escribo una consulta para agregar una nueva columna y renombrar la base de datos y el nombre de la tabla tanto que puedo agregar una nueva columna ... pero con la ayuda del método alter table no puedo hacerlo ... cambiar la base de datos y la tabla no es la tarea deseada ... debería estar trabajando con alter table..todavía no puedo hacerlo con el método alter table
Aamirkhan
@ user370305 ¿debería tener que agregar una nueva columna en la declaración tablle create para nuevos usuarios que instalan la aplicación por primera vez?
Ahesanali Suthar
15

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

    }

}
Edward Bagby
fuente
Esta es la forma de manejar múltiples actualizaciones. Comprobando de qué versión procede!
Ricardo
Si pasa de la versión 1 a la 3 directamente (si alguien no actualiza automáticamente la aplicación), no llegará al caso 2.
TyMarc
@ TyMarc: sí, se actualizará a las versiones 2 y luego a 3. El conmutador usa la versión anterior. Entonces, en su ejemplo, la versión anterior es 1. El código ejecutará el caso 1, que actualiza de la versión 1 a la 2, y luego ejecutará el caso 2 (ya que no hay interrupción;), que actualiza de 2 a 3. Está bien en la descripción.
Edward Bagby
4

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)

 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 nueva y el usuario de actualización de la aplicación

sssvrock
fuente
3

@ 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.

dora
fuente
sí, cambiar el nombre de la base de datos y desinstalar la aplicación y reinstalarla nuevamente resolvería el problema
Aamirkhan
@Aamirkhan, mueva el cheque a la siguiente respuesta para que la solución más clara esté disponible para el público.
AlleyOOP
3

Creo que no deberíamos comprobar 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, onUpdrade () llamará y la condición será verdadera, por lo que deberíamos verificar así

if(oldVersion==1) 
{

}

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.

Himanshu arora
fuente
1

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

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 pasado 1por la versión.

Cuando cambié la versión 1anterior ( 2o superior), onUpgrade()se invocará. Y realizar las modificaciones SQL que pretendo hacer. Mi constructor de clases después de cambiar la versión:

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

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");
    }
}
Blasanka
fuente
1

Simplemente cambie su código

privado final int DATABASE_VERSION = 1;

a

privado estático final int DATABASE_VERSION = 2;

Shahzad Ahmad
fuente
0

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

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

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");
    }
}
Digvij Borda
fuente