5
respostas

Erro INSERT banco de dados;

Estou fazendo, paralelamente ao professor, a implementação de novas features dentro do projeto, por exemplo integrando o que aprendi na parte 1 do curso de Flutter com esse projeto atual.

O problema começa no banco de dados. Quando executo a tabela da parte de contatos, não tenho problemas. Já quando executo a parte de transferências, apresenta esse problema:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E/SQLiteLog( 8176): (1) no such table: transferencias in "SELECT * FROM transferencias"

The following _CastError was thrown building FutureBuilder<List>(dirty, state: _FutureBuilderState<List>#37465): The relevant error-causing widget was FutureBuilder<List> Null check operator used on a null value

package:bytebank/…/transferencia/lista_transferencia.dart:23 When the exception was thrown, this was the stack

#0 ListaTransferencias.build. package:bytebank/…/transferencia/lista_transferencia.dart:62

#1 _FutureBuilderState.build package:flutter/…/widgets/async.dart:775

#2 StatefulElement.build package:flutter/…/widgets/framework.dart:4691

#3 ComponentElement.performRebuild package:flutter/…/widgets/framework.dart:4574

#4 StatefulElement.performRebuild package:flutter/…/widgets/framework.dart:4746 ...

Já tentei diversas soluções que encontrei no StackOverflow mas nenhuma funcionou, estou quase mudando de banco de dados kkkkkkkkkk help me

Future<Database> createDatabase() {
  return getDatabasesPath().then((dbPath) {
    final String path = join(dbPath, "bytebank.db");
    return openDatabase(path, onCreate: (db, version) async {
      await db.execute("CREATE TABLE contatos("
          "id INTEGER PRIMARY KEY, "
          "nome TEXT, "
          "numero_conta INTEGER)");
      await db.execute("CREATE TABLE transferencias("
          "idTrans INTEGER PRIMARY KEY, "
          "valor TEXT, "
          "numero_conta INTEGER");
    }, version: 2);
  });
}

Future<int> saveContato(Contato contato) {
  return createDatabase().then((db) {
    final Map<String, dynamic> contatoMap = Map();
    contatoMap["nome"] = contato.nome;
    contatoMap["numero_conta"] = contato.numeroConta;
    return db.insert("contatos", contatoMap);
  });
}

Future<int> saveTransfer(Transferencia transferencia) {
  return createDatabase().then((db) {
    final Map<String, dynamic> transferenciaMap = Map();
    transferenciaMap["valor"] = transferencia.valor;
    transferenciaMap["numero_conta"] = transferencia.numeroConta;
    return db.insert("transferencias", transferenciaMap);
  });
}

Future<List<Contato>> findAll() {
  return createDatabase().then((db) {
    return db.query("contatos").then((maps) {
      final List<Contato> contatos = [];
      for (Map<String, dynamic> map in maps) {
        final Contato contato = Contato(
          map["id"],
          map["nome"],
          map["numero_conta"],
        );
        contatos.add(contato);
      }
      return contatos;
    });
  });
}

Future<List<Transferencia>> findAllTransfer() {
  return createDatabase().then((db) async {
    // final a = await db.query("transferencias");
    // print(a);
    // return [];

    return db.query("transferencias").then((maps) {
      final List<Transferencia> transferencias = [];
      for (Map<String, dynamic> map in maps) {
        final Transferencia transferencia = Transferencia(
          map["idTrans"],
          map["valor"],
          map["numero_conta"],
        );
        transferencias.add(transferencia);
      }
      return transferencias;
    });
  });
}

Meu código completo está nesse repositório: https://github.com/brnocorreia/flutter_studies_bytebank

5 respostas

Ola. Tudo bem. Testei seu código e notei que ao criar a table transferencias você não fechou o parênteses(linha 18)

Ficaria assim:

Future<Database> createDatabase() {
  return getDatabasesPath().then((dbPath) {
    final String path = join(dbPath, "bytebank.db");
    return openDatabase(path, onCreate: (db, version) async {
      await db.execute("CREATE TABLE contatos("
          "id INTEGER PRIMARY KEY, "
          "nome TEXT, "
          "numero_conta INTEGER)");
      await db.execute("CREATE TABLE transferencias("
          "idTrans INTEGER PRIMARY KEY, "
          "valor TEXT, "
          "numero_conta INTEGER)");
    }, version: 2);
  });
}

Então, eu coloquei o parênteses como você falou mas continua dando erro :(( Aparentemente menor porém ainda com erro. Importante mencionar que só aparece esse erro quando clico no botão para ir a aba de transferências.

E/SQLiteLog( 5965): (1) no such table: transferencias in "SELECT * FROM transferencias"

The following _CastError was thrown building FutureBuilder<List>(dirty, state: _FutureBuilderState<List>#b8f4f):

Null check operator used on a null value

Esse problema é pq vocês está usando um operador ! em um valor null. Procura onde está, ve se a variavel está sendo inicializada normalmente e tenta trocar por um ?

Então, eu suspeito que o erro esteja dentro do meu FutureBuilder. Troquei os valores com ! por ? e resolveu a parte do null check mas agora meu SQLite continua não conseguindo achar a tabela que criei...

Na parte do ConnectionState.done abaixo:

body: FutureBuilder<List<Transferencia>>(
          initialData: [],
          future: Future.delayed(Duration(seconds: 1))
              .then((value) => findAllTransfer()),
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                break;
              case ConnectionState.waiting:
                return Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      CircularProgressIndicator(
                        color: Colors.green[900],
                      ),
                      Padding(
                        padding: const EdgeInsets.all(12.0),
                        child: Text(
                          "Carregando",
                          style: TextStyle(
                            fontWeight: FontWeight.bold,
                            fontSize: 16.0,
                          ),
                        ),
                      )
                    ],
                  ),
                );
              case ConnectionState.active:
                break;
              case ConnectionState.done:
                final List<Transferencia>? transferencias = snapshot.data;
                return ListView.builder(
                  itemBuilder: (context, index) {
                    final Transferencia? transferencia = transferencias?[index];
                    return ItemTransferencia(transferencia!);
                  },
                  itemCount: transferencias?.length ?? 0,
                );
            }
            return Text("Erro desconhecido");
          }),

Bom dia Bruno, tudo bom?

O seu erro pode está sendo gerado pelo simples fato de um erro de digitação. No inicio do seu código você digitou:

body: FutureBuilder<List<Transferencia>>(
          initialData: [],
          future: Future.delayed(Duration(seconds: 1))
              .then((value) => findAllTransfer()),
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                break;

Onde deveria está, da seguinte forma:

body: FutureBuilder<List<Transferencia>>(
          initialData: [],
          future: Future.delayed(Duration(seconds: 1))
              .then((value) => findAllTransfer()),
          builder: (context, snapshot) {
            switch (snapshot.connectionState) {
              case ConnectionState.done:
                break;

ConnectionState.done , e não (ConnectionState.none)

Qualquer dúvida, estamos a disposição.