How to update BD sqlite java android

Asked

Viewed 4,323 times

5

How do I add a column in the database of my android java application without losing 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 current columns.

  • 1

    I think it would be easier to answer if you included what you have done so far, a snippet of current code or at least what you have tried.

2 answers

6


You can use the following DDL:

ALTER TABLE tabela ADD COLUMN nova_coluna CHAR(50)

https://stackoverflow.com/questions/4253804/insert-new-column-into-table-in-sqlite

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

CREATE TALBE IF NOT EXISTS table ...restante da query

Thus, when a new version of the database (or the first installation of the app) is installed the table will be created only if it does not exist, preserving the data already installed (when the app is updated), and the ALTER TABLE will change the structure of your table.

These commands will only be executed 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.

  • Good! Does this line have to be rotated only once? if it rotates again it will give conflict?

  • 1

    Put that line on onUpgrade() and change the database version, it will be called when the database version is changed. @Emersonbarcellos

0

Great what you can also do, if any, is create a class with static information about the alter table that will update your 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 we have 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 method below can be entered in 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, in case you are building a system where the version control should be very strict this is a great way to keep the bank under control;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.