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

ERRO - table contacts has no column named account_number

Estou preso no seguinte erro:

D/EGL_emulation(19312): eglMakeCurrent: 0x9d722760: ver 2 0 (tinfo 0x8870b9a0) E/SQLiteLog(19312): (1) table contacts has no column named account_number E/flutter (19312): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: DatabaseException(table contacts has no column named account_number (code 1): , while compiling: INSERT INTO contacts (name, account_number) VALUES (?, ?)) sql 'INSERT INTO contacts (name, account_number) VALUES (?, ?)' args [alex, 1000]}

Achei que era fácil de resolver, pois ele dá a entender que é algum erro na nomenclatura do account_number dentro do db ou do future save. Mas eu fiz tudo certo e inclusive copiei os códigos do commit da aula pro meu AS, mas o erro persiste.

Já dei flutter clean também e não resolveu. Não tenho ideia do que pode ser.

O código funciona normal quando coloco no main só o findAll, retornando pelo debugprint uma lista sem nada ([]). Então creio que o problema esteja no save, mas é só um chute.

Código do app_database.dart

import 'package:bytebank_app/models/contact.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

Future<Database> createDatabase() {
  return getDatabasesPath().then((dbPath) {
    final String path = join(dbPath, 'bytebank.db');
    return openDatabase(path, onCreate: (db, version) {
      db.execute('CREATE TABLE contacts('
          'id INTEGER PRIMARY KEY, '
          'name TEXT, '
          'account_number INTEGER)');
    }, version: 1);
  });
}

Future<int> save(Contact contact) {
  return createDatabase().then((db) {
    final Map<String, dynamic> contactMap = Map();
    contactMap['name'] = contact.name;
    contactMap['account_number'] = contact.accountNumber;
    return db.insert('contacts', contactMap);
  });
}

Future<List<Contact>> findAll() {
  return createDatabase().then((db) {
    return db.query('contacts').then((maps) {
      final List<Contact> contacts = [];
      for (Map<String, dynamic> map in maps) {
        final Contact contact = Contact(
          map['id'],
          map['name'],
          map['account_number'],
        );
        contacts.add(contact);
      }
      return contacts;
    });
  });
}

Código main.dart

import 'package:bytebank_app/screens/dashboard.dart';
import 'package:flutter/material.dart';

import 'database/app_database.dart';
import 'models/contact.dart';

void main() {
  runApp(BytebankApp());
  save(Contact(0, 'alex', 1000)).then((id) {
    findAll().then((contacts) => debugPrint(contacts.toString()));
  });
}

class BytebankApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Colors.green[900],
        accentColor: Colors.blueAccent[700],
        buttonTheme: ButtonThemeData(
          buttonColor: Colors.blueAccent[700],
          textTheme: ButtonTextTheme.primary,
        ),
      ),
      home: Dashboard(),
    );
  }
}
2 respostas

Fala Vitório, tudo bem?

Seu raciocínio está correto, e eu concordo com tudo que você falou. Parece sim ser um erro de nomenclatura, alguma falha de digitação entre a criação das colunas (no momento que a tabela foi criada), e o que é usado no save.

O problema é que uma vez criado, o DB vai permanecer com a coluna errada, não importa se você faça o flutter clean pois esses dados estão no seu smartphone/emulador.

Minhas sugestão, para testarmos se é isso mesmo, é você mudar o nome do banco no join, como o banco não vai existir, ele vai criar um do zero com as colunas corretas. Algo como:

final String path = join(dbPath, 'bytebank02.db');

Espero que funcione, mas se não funcionar, estamos aqui!

solução!

Deu certo, Ricarth! Valeu pela ajuda