Eu criei minhas tabelas no meu SQLiteOpenHelper
onCreate()
mas recebo
SQLiteException: no such table
ou
SQLiteException: no such column
erros. Por quê?
NOTA:
(Este é o resumo amalgamado de dezenas de perguntas semelhantes toda semana. Tentativa de fornecer aqui uma pergunta / resposta "canônica" do wiki da comunidade, para que todas essas perguntas possam ser direcionadas para uma boa referência.)
Respostas:
SQLiteOpenHelper
onCreate()
eonUpgrade()
retornos de chamada são chamados quando o banco de dados é realmente aberto, por exemplo, por uma chamada paragetWritableDatabase()
. O banco de dados não é aberto quando o próprio objeto auxiliar do banco de dados é criado.SQLiteOpenHelper
versões dos arquivos de banco de dados. O número da versão é oint
argumento passado ao construtor . No arquivo de banco de dados, o número da versão é armazenadoPRAGMA user_version
.onCreate()
é executado apenas quando o arquivo do banco de dados não existia e foi criado. SeonCreate()
retornar com êxito (não lança uma exceção), presume-se que o banco de dados seja criado com o número da versão solicitada. Como implicação, você não deve pegarSQLException
s emonCreate()
si mesmo.onUpgrade()
é chamado apenas quando o arquivo de banco de dados existe, mas o número da versão armazenada é menor que o solicitado no construtor. oonUpgrade()
deve atualizar o esquema da tabela para a versão solicitada.Ao alterar o esquema da tabela no código (
onCreate()
), verifique se o banco de dados está atualizado. Duas abordagens principais:Exclua o arquivo de banco de dados antigo para que
onCreate()
seja executado novamente. Isso geralmente é preferido no momento do desenvolvimento, onde você tem controle sobre as versões instaladas e a perda de dados não é um problema. Algumas maneiras de excluir o arquivo de banco de dados:Desinstale o aplicativo. Use o gerenciador de aplicativos ou a
adb uninstall your.package.name
partir do shell.Limpar dados do aplicativo. Use o gerenciador de aplicativos.
Incremente a versão do banco de dados para que
onUpgrade()
seja chamada. Isso é um pouco mais complicado, pois é necessário mais código.Para atualizações de esquema em tempo de desenvolvimento em que a perda de dados não é um problema, você pode apenas usar
execSQL("DROP TABLE IF EXISTS <tablename>")
para remover suas tabelas existentes e chamaronCreate()
para recriar o banco de dados.Para versões lançadas, você deve implementar a migração de dados
onUpgrade()
para que seus usuários não percam seus dados.fonte
onUpdate()
Verifique todas as versões antigas e faça a migração de dados adequada. E então, quando um usuário atualizar seu aplicativo (ele possui arquivos db antigos),onUpgrade
será acionado e, se o usuário for instalado recentemente,onCreate()
será acionado.Para adicionar ainda mais pontos ausentes aqui, conforme solicitação de Jaskey
A versão do banco de dados é armazenada no diretório
SQLite
arquivo de banco de dados.catch é o construtor
Portanto, quando o construtor auxiliar do banco de dados é chamado com um
name
(2º param), a plataforma verifica se o banco de dados existe ou não e se o banco de dados existe, ele obtém as informações da versão do cabeçalho do arquivo do banco de dados e aciona a chamada corretaComo já explicado na resposta antiga, se o banco de dados com o nome não existir, ele será acionado
onCreate
.A explicação abaixo explica o
onUpgrade
caso com um exemplo.Digamos, sua primeira versão do aplicativo teve a versão de
DatabaseHelper
extensão doSQLiteOpenHelper
construtor (estendendo-se )1
e, em seguida, você forneceu um aplicativo atualizado com o novo código-fonte com a versão passada e2
, automaticamente, quando aDatabaseHelper
plataforma é construída, é acionadaonUpgrade
ao ver o arquivo já existe, mas a versão é inferior à versão atual que você passou.Agora diga que você está planejando fornecer uma terceira versão do aplicativo com a versão db como
3
(a versão db é aumentada apenas quando o esquema do banco de dados deve ser modificado). Nessas atualizações incrementais, você deve escrever a lógica de atualização de cada versão de forma incremental para obter um código melhor de manutençãoExemplo de pseudo-código abaixo:
Observe a
break
declaração ausente no caso1
e2
. É isso que quero dizer com atualização incremental.Diga se a versão antiga é
2
e a nova é4
, a lógica atualizará o banco de dados de2
para3
e depois para4
Se a versão antiga é
3
e nova versão é4
, ela só vai executar a lógica de atualização para3
a4
fonte
onCreate()
Quando criamos o DataBase pela primeira vez (ou seja, o banco de dados não existe),
onCreate()
criamos o banco de dados com a versão que é passada emSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
O método é criar as tabelas que você definiu e executar qualquer outro código que você escreveu. No entanto, esse método será chamado apenas se o arquivo SQLite estiver ausente no diretório de dados do seu aplicativo (/data/data/your.apps.classpath/databases
).Este método não será chamado se você tiver alterado seu código e reiniciado no emulador. Se você deseja
onCreate()
executar, use adb para excluir o arquivo de banco de dados SQLite.onUpgrade()
SQLiteOpenHelper
deve chamar o super construtor.onUpgrade()
método será chamado apenas quando o número inteiro da versão for maior que a versão atual em execução no aplicativo.onUpgrade()
método seja chamado, você precisa incrementar o número da versão no seu código.fonte
Talvez seja tarde demais, mas gostaria de compartilhar minha resposta curta e doce. por favor, verifique resposta para um mesmo problema. Definitivamente irá ajudá-lo. Não há mais especificações profundas.
Se você tem certeza da sintaxe para criar tabela, isso pode acontecer quando você adiciona uma nova coluna à mesma tabela, para isso ...
1) Desinstale do seu dispositivo e execute-o novamente.
OU
2) Configuração -> aplicativo -> ClearData
OU
3) Altere
DATABASE_VERSION
sua classe "DatabaseHandler" (se você adicionou uma nova coluna, ela será atualizada automaticamente)OU
4) Altere
DATABASE_NAME
sua classe "DatabaseHandler" (eu enfrentei o mesmo problema. Mas obtive êxito ao alterarDATABASE_NAME
.)fonte
Pontos a serem lembrados ao estender
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Isso deve ser chamado pela primeira linha do construtoronCreate
eonUpgrade
(se necessário)onCreate
será invocado apenas quandogetWritableDatabase()
ougetReadableDatabase()
for executado. E isso será chamado apenas uma vez quando umDBName
especificado na primeira etapa não estiver disponível. Você pode adicionar a consulta de criação de tabela noonCreate
métodoDBversion
e fazer as consultas naonUpgrade
tabela ou simplesmente desinstalar e instalar o aplicativo.fonte
onCreate é chamado pela primeira vez quando a criação de tabelas é necessária. Precisamos substituir esse método em que escrevemos o script para criação de tabela que é executado pelo SQLiteDatabase. método execSQL. Após executar na implantação inicial, esse método não será chamado em diante.
onUpgrade Esse método é chamado quando a versão do banco de dados é atualizada. Suponha que, pela primeira vez, a versão do banco de dados seja 1 e, na segunda, houve alterações na estrutura do banco de dados, como adicionar coluna extra na tabela. Suponha que a versão do banco de dados seja 2 agora.
fonte
Você pode criar banco de dados e tabela como
Nota: se você deseja criar outra tabela ou adicionar colunas ou nenhuma tabela, basta incrementar a VERSION
fonte
Banco de dados sqlite substitui dois métodos
1) onCreate (): esse método é chamado apenas uma vez quando o aplicativo é iniciado pela primeira vez. Por isso, chamou apenas uma vez
2) onUpgrade () Esse método é chamado quando alteramos a versão do banco de dados e, em seguida, esse método é chamado. Ele é usado para alterar a estrutura da tabela, como adicionar uma nova coluna após criar o DB Schema
fonte
nenhuma tabela encontrada é principalmente quando você não abriu a
SQLiteOpenHelper
classe comgetwritabledata()
e, antes disso, você também deve chamar make constructor com databasename & version. EOnUpgrade
é chamado sempre que houver um valor de atualização no número da versão fornecido naSQLiteOpenHelper
classe.Abaixo está o snippet de código (nenhuma coluna encontrada pode ser por causa da ortografia no nome da coluna):
fonte
Se você esquecer de fornecer uma string "name" como o segundo argumento para o construtor, ele criará um banco de dados "in-memory" que será apagado quando você fechar o aplicativo.
fonte
Desinstale seu aplicativo do emulador ou dispositivo. Execute o aplicativo novamente. (OnCreate () não é executado quando o banco de dados já existe)
fonte
O nome do seu banco de dados deve terminar com .db e as cadeias de consulta devem ter um terminador (;)
fonte
Verifique novamente sua consulta na classe DatabaseHandler / DatabaseManager (que você já fez)
fonte
No meu caso, recebo itens do arquivo XML com
<string-array>
, onde armazeno<item>
s. Nestes<item>
s, mantenho cadeias SQL e aplico um por umdatabaseBuilder.addMigrations(migration)
. Eu cometi um erro, esqueci de adicionar\
antes da citação e recebi a exceção:android.database.sqlite.SQLiteException: não existe essa coluna: some_value (código 1 SQLITE_ERROR):, durante a compilação: INSERT INTO table_name (id, nome) VALUES (1, some_value)
Portanto, esta é uma variante correta:
fonte
O método do Sqliteopenhelper possui métodos create e upgrade, create é usado quando qualquer tabela é criada pela primeira vez e o método de atualização é chamado sempre que o número de colunas da tabela é alterado.
fonte