How to upgrade BD sqlite java android

5

How do I add a column in the database of my android java application without losing the data from the current database? My code:

public DataBaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
        + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT, " + KEY_DESCRICAO + " TEXT)";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older table if existed
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

    // Create tables again
    onCreate(db);
}

And when I add a column it is not created because the table already exists and keeps the columns current.

    
asked by anonymous 31.05.2014 / 00:30

2 answers

6

You can use the following DDL:

ALTER TABLE tabela ADD COLUMN nova_coluna CHAR(50)

link

Add this code in the onCreate() method, shortly after your CREATE TABLE . Also, add to your creation query the create condition only if it does not exist, for example:

CREATE TALBE IF NOT EXISTS table ...restante da query
So when a new version of the database (or the first app install) is installed the table will only be created if it does not exist, preserving the data already installed (when the app is updated), and ALTER TABLE will change the structure of your table.

These commands will run only the first time the new version of the database is installed (or the first installation of the app).

I tested it here and it worked.

    
31.05.2014 / 01:02
0

Great what you can also do, if any, is to create a class with static information about the alter table that will update its base with version control:

below is the upgrade method:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String vers[] = null;

    /* AQUI É ONDE OCORRE A MÁGICA PARA ATUALIZAÇÃO DO BANCO, AO ESCREVER O CÓDIGO
     * DO BANCO VI QUE AO ATUALIZAR A VERSÃO DO BANCO, DE ACRODO COM
     * TODOS AS ORIENTAÇÕES, FAZ O DROP DA TABELA ATUALIZADA E DEPOIS RECRIAVA ELA, 
     * FIZ A ALTERAÇÃO PARA QUE AO MODIFICAR A VERSÃO DO BANCO, 
     * O DESENVOLVEDOR POSSA PASSAR OS DADOS CONTIDOS NA CLASSE ATUALIZACOESBANCO E
     * COM ESSES DADOS POSSA REALIZAR A ATUALIZAÇÃO */

    try {

        /* ELE PEGA A ÚLTIMA VERSÃO DO BANCO E COMPARA COM A NOVA, DE ACORDO COM A 
         * COMPARAÇÃO ELE VAI NA CLASSE ATUALIZACOESBANCO E COLETA OS SCRIPTS
         * DAS VERSÕES QUE ESTÃO PENDENTES E EXECUTA UM A UM */

        for (int i = oldVersion + 1; i <= newVersion; i++) {
            vers = new AtualizacoesBanco().selectScript(i);

            /*você pode utilizar qualquer table defitions para realizar 
              esse procedimento*/

            updateTabelasBanco(db, vers[0], vers[1],
                    vers[2], vers[3]);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Below is the version control class model:

public class AtualizacoesBanco {

// o modelo de atualização que é para ser passado no metodo onUpdate do        tabledefinition
// das tabelas na classe SthBancoOpenHelper é esse abaixo
// TABELA , CAMPO , TIPO , VALOR DEFAULT

public static String VER_1[] =  {"CONFIGURACAO", "NAO_VENDER_TITULO_ATRAZO", "TEXT", "S"};


/*AO CRIAR O CAMPO COM A VERSÃO ACIMA, VOCÊ DEVERÁ INFORMAR LOGO ABAIXO NO MÉTODO
SELECTSTRING O CASE DA VERSÃO, NO CASO DO MÉTODO ELE SEMPRE IRÁ RETORNAR INICIANDO DA 
VERSÃO 1 POR CONTA DE QUE A PRIMEIRA VERSÃO PUBLICA COM AS ALTERAÇÕES
*/
public static String[] selectScript(int ver){
    switch (ver) {
    case 1:
        return VER_1;
    default:
        return null;         
    }

}

}

The following method can be inserted into the openHelp class you created:

//com esse método você vai pode alterar a estrutura das tabelas de seu banco
public static void updateTabelasBanco(SQLiteDatabase db, String table,
        String column, String typ, String valor) {
    try {
        db.execSQL("ALTER TABLE " + table + " ADD " + column + " " + typ);
        if (valor != ""){
            db.execSQL("update "+ table +" set "+ column +" = '"+ valor +"'");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

With this you have a version control of your bank, if you are building a system where version control should be very strict, this is a great way to keep the bank under control;

    
24.12.2014 / 18:16