Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Ensinando código para colocar ID pelo SQFlite - Passo a Passo

Então galera, espero que ajude quem está querendo implementar a parte de ID. Com certeza tem outras maneiras de fazer, mas essa até que é bem simples.

A criação do db ficaria assim:


static const String tableSql = 'CREATE TABLE $_tablename('
      '$_id INTEGER PRIMARY KEY, '
      '$_nome TEXT, '
      '$_prioridade INTEGER, '
      '$_image TEXT)';

  static const String _tablename = 'tasTable';
  static const String _id = 'id';
  static const String _nome = 'nome';
  static const String _prioridade = 'prioridade';
  static const String _image = 'image';

save, findAll, find, delete e toMap não tem alteração, mas o toList tem.

List<Task> toList(List<Map<String, dynamic>> listaDeTarefas) {
    final List<Task> tarefas = [];
    for (Map<String, dynamic> linha in listaDeTarefas) {
      final Task tarefa = Task(
        linha[_id],
        linha[_nome],
        linha[_image],
        linha[_prioridade],
      );
      tarefas.add(tarefa);
    }
    return tarefas;
  }

Agora a parte nova, para pegar o ID automaticamente eu criei um método dentro do TaskDao. Ele verifica o tamanho do banco de dados, se for vazio ele irá retornar uma variável com valor 1, para iniciar o banco, se o valor não for zero, ele vai retornar uma variável tamanho do banco + 1.

Future<int> pegarTamanhoDB() async {
    final Database bancoDeDados = await getDatabase();
    final List<Map<String, dynamic>> result =
        await bancoDeDados.query(_tablename);
    print('Pegando tamanho da lista');
    if (result.isEmpty) {
      const int varParaID = 1;
      return varParaID;
    } else {
      int id = result.length;
      final varParaID = id++;
      return varParaID;
    }
  }

Na classe Task, única modificação é no construtor:


  final int id;
  final String nome;
  final String image;
  final int prioridade;

  Task(
    this.id,
    this.nome,
    this.image,
    this.prioridade,
  );

E agora por último, a parte do ElevatedButton que salva a Task, ele tem que passar o ID junto com os outros controladores, pode ser dessa forma:

ElevatedButton(
                        onPressed: () async {
                          if (_formKey.currentState!.validate()) {
                            final int idCorreto =
                                await TaskDao().pegarTamanhoDB();        //Aqui ele pega o ID
                            await TaskDao().save(Task(
                                idCorreto,                               //Aqui envia para o db
                                nameController.text,
                                imagemController.text,
                                int.parse(prioridadeController.text)));

                            ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                content: Text('Concluído'),
                              ),
                            );
                            Navigator.pop(context);
                          }
                        },

É isso ai, espero ter ajudado, qualquer coisa to aqui, abraço e bons estudos.

2 respostas
solução!

Aprovadíssimo!!

Galera pode seguir esse cara que ele mandou a braba!

Paulo, muito obrigado. A sua atitude é extremamente importante para todos da nossa pequena de comunidade, o que você acabou de fazer é muito especial e eu fico feliz por termos alunos e alunas como você. Existem muitos detalhes e implementações que a galera procura, que infelizmente não cabem no curso, e a proatividade que você demonstrou ajuda muito todos nós.

Tmj Caio! Aprendendo com você :D