Já criei tabelas sqlite para meu aplicativo, mas agora quero adicionar uma nova tabela ao banco de dados.
Eu mudei a versão do banco de dados conforme abaixo
private static final int DATABASE_VERSION = 2;
e string adicionada para criar a tabela
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
e onUpgrade
como abaixo:
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
Mas por algum motivo, a nova tabela não está sendo criada. O que estou fazendo de errado?
Respostas:
1. Sobre onCreate () e onUpgrade ()
onCreate(..)
é chamado sempre que o aplicativo é instalado recentemente.onUpgrade
é chamado sempre que o aplicativo é atualizado e iniciado e a versão do banco de dados não é a mesma.2. Incrementando a versão db
Você precisa de um construtor como:
IMPORTANTE: Incrementar apenas a versão do aplicativo não é suficiente para
onUpgrade
ser chamado!3. Não se esqueça de seus novos usuários!
Não se esqueça de adicionar
ao método onCreate () ou aplicativos recém-instalados não terão a tabela.
4. Como lidar com várias mudanças no banco de dados ao longo do tempo
Quando você tiver atualizações sucessivas de aplicativos, várias das quais com atualizações de banco de dados, certifique-se de verificar
oldVersion
:Dessa forma, quando um usuário atualiza da versão 1 para a versão 3, ele obtém as duas atualizações. Quando um usuário atualiza da versão 2 para a 3, ele apenas obtém a atualização da revisão 3 ... Afinal, você não pode contar com 100% de sua base de usuários para atualizar cada vez que você lançar uma atualização. Às vezes, eles pulam uma atualização ou 12 :)
5. Manter seus números de revisão sob controle durante o desenvolvimento
E finalmente ... ligando
desinstala totalmente o aplicativo. Quando você instalar novamente, terá a garantia de acertar, o
onCreate
que o impede de continuar incrementando a versão do banco de dados para a estratosfera conforme você desenvolve ...fonte
oldVersion
argumento aprovado? Se qualquer instrução de atualização puder ser repetida, você pode acabar repetindo-a em um banco de dados quase sempre atualizado. Se uma das instruções é para truncar uma tabela, isso seria muito ruim.newVersion
é meio inútil, já que você sempre define a versão atual do banco de dados de qualquer maneira no construtor (consulte a parte 2) e sempre corresponderá. A ideia principal aqui é que você não quer apenas atualizar de onde o usuário estiver,newVersion
sem passar por todas as outras atualizações incrementais entre elas.CREATE_READINGS
lógica nunca deve estar em onUpgrade, pois estava noonCreate
método de sua primeira versão. Pense nos casos doonUpgrade
switch como "Estou atualizando DEoldVersion
". Você não criaria a tabela de leituras se estivesse atualizando da versão 1, pois ela já deveria existir. Espero que isso faça sentido ...Seu código parece correto. Minha sugestão é que o banco de dados já pensa que está atualizado. Se você executou o projeto depois de incrementar o número da versão, mas antes de adicionar a
execSQL
chamada, o banco de dados em seu dispositivo / emulador de teste pode já acreditar que está na versão 2.Uma maneira rápida de verificar isso seria alterar o número da versão para 3 - se ele for atualizado depois disso, você sabe que foi apenas porque seu dispositivo acreditou que já estava atualizado.
fonte
onCreate()
como jkschneider apontou.Você pode usar o
onUpgrade
método SQLiteOpenHelper . No método onUpgrade, você obtém oldVersion como um dos parâmetros.No
onUpgrade
uso aswitch
e em cada um doscase
s, use o número da versão para controlar a versão atual do banco de dados.É melhor fazer um loop de
oldVersion
paranewVersion
, incrementandoversion
em 1 por vez e, em seguida, atualizar o banco de dados passo a passo. Isso é muito útil quando alguém com a versão 1 do banco de dados atualiza o aplicativo depois de um longo tempo, para uma versão que usa a versão 7 do banco de dados e o aplicativo começa a travar devido a certas alterações incompatíveis.Em seguida, as atualizações no banco de dados serão feitas passo a passo, cobrindo todos os casos possíveis, ou seja, incorporando as alterações no banco de dados feitas a cada nova versão e, assim, evitando que seu aplicativo trave.
Por exemplo:
fonte
A resposta de @jkschneider está certa. No entanto, existe uma abordagem melhor.
Grave as alterações necessárias em um arquivo sql para cada atualização conforme descrito no link https://riggaroo.co.za/android-sqlite-database-use-onupgrade-correctly/
from_1_to_2.sql
from_2_to_3.sql
from_3_to_4.sql
Esses arquivos .sql serão executados no método onUpgrade () de acordo com a versão do banco de dados.
DatabaseHelper.java
Um exemplo de projeto também é fornecido no mesmo link: https://github.com/riggaroo/AndroidDatabaseUpgrades
fonte
Manipular versões de banco de dados é uma parte muito importante do desenvolvimento de aplicativos. Presumo que você já tenha a classe AppDbHelper estendendo
SQLiteOpenHelper
. Quando você estendê-lo você precisará implementaronCreate
eonUpgrade
método.Quando
onCreate
eonUpgrade
métodos chamadosonCreate
chamado quando o aplicativo é instalado recentemente.onUpgrade
chamado quando o aplicativo é atualizado.Organizando versões de banco de dados Eu gerencio versões em métodos de classe. Criar implementação de migração de interface. Por exemplo, para a
MigrationV1
classe de criação da primeira versão, criação da segunda versãoMigrationV1ToV2
(essas são minha convenção de nomenclatura)Migração de exemplo:
onCreate
: ComoonCreate
será chamado quando o aplicativo for instalado recentemente, também precisamos executar todas as migrações (atualizações da versão do banco de dados). EntãoonCreate
será parecido com isto:onUpgrade
: Este método será chamado quando o aplicativo já estiver instalado e for atualizado para a nova versão do aplicativo. Se o aplicativo contiver quaisquer alterações no banco de dados, coloque todas as alterações no banco de dados na nova classe de migração e versão do banco de dados de incremento.Por exemplo, digamos que o usuário instalou o aplicativo com a versão 1 do banco de dados e agora a versão do banco de dados está atualizada para 2 (todas as atualizações de esquema mantidas
MigrationV1ToV2
). Agora, quando o aplicativo é atualizado, precisamos atualizar o banco de dados aplicando as mudanças no esquema do banco de dadosMigrationV1ToV2
como este:fonte