4
respostas

Atualização das colunas no sqflite já criado

Bom dia, Estou tentando colocar o Uudi na criacao de tasks, conforme sugestao no curso, mas quando criei o banco de dados com sqflite eu nao consoderei uma coluna para guardar essas informacoes. Minha tabela tinha apenas as colunas sugeridas pelo Kako, e agora mesmo colocando a coluna no arquivo DAO quando "cria" a tabela se ela nao existir, quando salvo o formulario com o Uuid ele indica no a coluna "UudiTask" nao existe. Tentei trocar o none da tabela na variavel do nome dela, mas ai aparecem dois erros, o primeiro quando lista as tarefas e outro quando envio o form das tarefas. Ambos informando que a tabela nao existe. podem me dar sugestoes de como contornar isso. obrigado

4 respostas

Oi!

É importante lembrar que ao adicionar uma nova coluna em uma tabela já existente, é necessário atualizar a estrutura do banco de dados.

Uma maneira de contornar esse problema é utilizando o conceito de migração de banco de dados. Com a migração, você pode adicionar a nova coluna à estrutura da tabela existente sem perder os dados já salvos.

  1. Crie uma nova versão do seu banco de dados, incrementando o número da versão atual. Por exemplo, se a versão atual é 1, você pode criar a versão 2.

  2. No método onUpgrade do seu DatabaseProvider, verifique qual é a versão atual do banco de dados e execute as alterações necessárias para adicionar a nova coluna. Por exemplo:

@override
void onUpgrade(Database db, int oldVersion, int newVersion) async {
  if (oldVersion < 2) {
    await db.execute('ALTER TABLE tasks ADD COLUMN UuidTask TEXT');
  }
}

Dessa forma, quando você atualizar a versão do banco de dados, a nova coluna será adicionada à tabela existente.

AHH lembra de atualizar o número da versão do banco de dados em seu DatabaseProvider para que a migração seja executada corretamente.

Boa noite, obrigado pela resposta.

Mas confesso que fiquei um pouco perdido, ao realizar pesquisas sobre "onUpgrade" encontrei bastante material mais voltado ao desenvolvimento nativo Android, o que encontre relacionado a Flutter foi pouco, mas entendi que o tópico "Upgrade de banco" é mto importante no desenvolvimento e gostaria de aprender mais.

Pelo o que entendi, o código que vc sugeriu deve estar no meu arquivo chamado database.dart cujo tem o código a seguir:

Future<Database> getDatabase() async{
  final String path = join( await getDatabasesPath(),'tasks.db');
  return openDatabase(path, onCreate: (db, version) {
    db.execute(GuestDao.tableSql);
  }, version: 1,);
}

E o que eu fiquei com dúvida foi:

  1. Eu mudando essa variável "version: 1" para "version: 2" e automaticamente se entende que é uma nova versão do banco?
  2. Em qual momento eu chamaria "onUpgrade"?
  3. E por último, vc comentou para atualizar o número da versão do "DatabaseProvider" mas não encontrei onde mudaria;

Outro arquivo que tenho tb é o task_dao.dart, devo mexer em alguma parte dele tb? Obrigado pela atenção.

Bom dia,

Estava com essa mesma dificuldade, fiz alguns testes no meu projeto trocando a versão manualmente no atributo "version" passando uma nova versão e "sub-entendi" que ele verifica com a versão atual do banco e quando estou "abrindo" a database ele verifica a versão do banco e atualiza, existe um segundo atributo do openDatabase() que é o "onUpgrade" que ele é chamado quando você passa a nova versão do banco. Não sei dizer se a melhor prática seria alterar manualmente a versão do banco ou se teria um método mas eficiente, talvez com uma variável de escopo global.

Enfim, não sei se ajudei com sua dúvida. Mas pelo pouco que sei, consegui identificar isso.

Boa noite Alex, Então, eu pensei em fazer isso da versão tb, mas para sair mexendo sem fundamento preferi não, mas quando tiver mais tempo vou fazer umas tentativas como vc sugeriu. De qualquer forma, eu "criei" um novo banco de dados, torquei o nome do banco e ele funcionou. Sei que não é a melhor prática, mas para esse começo acho que vale. Obrigado pela contribuição. Abraço.