3
respostas

Erro para "Abrir o banco de dados" -- getDatabase();

Boa tarde, Estou companhando as aulas "Flutter: aplicando persitência de dados" e na parte que o Kako chama o banco

final Database bancoDeDados = await getDatabase();

Acredito que não esteja tendo sucesso, aparece o seguinte erro na aba RUN

E/flutter ( 4504): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Bad state: databaseFactory not initialized
E/flutter ( 4504): databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi`
E/flutter ( 4504): You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API

Estou desenvolvendo em um Mac, mas pelo me informei, isso não faz diferença neste caso. Já tentei usar o sqflite_common_ffi mas continua dando o mesmo erro. Acredito que por algum motivo o banco não está sendo criado. Conseguem me ajudar a resolver isso, ou dar alguma ideia de como consigo debugar isso melhor? Obrigado pela ateção.

3 respostas

Os arquivos voltaram a "funcionar", o que eu fiz exatamente eu não sei.

Mas acabei inserindo o no pubspec.yaml abaixo do 'cupertino_icons' e acima do 'sqflite':

path: ^1.8.3

Além de ter reiniciado a aplicação inteira. Obrigado pela atenção, se alguem souber mais sobre esse problema certamente irá ajudar. Abraço

Olá, Marcelo! Tudo bem?

Pelo que entendi, você está tendo problemas com a inicialização do banco de dados no Flutter. O erro que você está recebendo indica que a factory do banco de dados não foi inicializada.

Quando você está usando o sqflite_common_ffi, é necessário inicializar a factory do banco de dados antes de usar a API global openDatabase. Isso é feito chamando databaseFactory = databaseFactoryFfi;.

No entanto, como você mencionou que tentou usar o sqflite_common_ffi e ainda assim está recebendo o mesmo erro, pode ser que a inicialização não esteja ocorrendo corretamente.

Aqui está um exemplo de como você pode fazer isso:

import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';

void main() {
  // Inicializa a factory do banco de dados
  sqfliteFfiInit();

  // Agora, você pode chamar a função getDatabase
  final Database bancoDeDados = await getDatabase();
}

Neste exemplo, a função sqfliteFfiInit() é chamada antes de getDatabase(). Isso garante que a factory do banco de dados seja inicializada antes de tentar abrir o banco de dados.

Se você já fez isso e ainda está enfrentando o problema, pode ser útil verificar se a versão do sqflite_common_ffi que você está usando é compatível com a versão do Flutter que você tem instalado. Às vezes, incompatibilidades de versão podem causar problemas semelhantes a esse.

Espero ter ajudado e bons estudos!

Eu estava tendo o mesmo problema porque tinha colocado o método getDataBase() dentro de uma classe, em vez de diretamente dentro do pacote como é feito na aula.

Inclusive, fica a curiosidade (talvez isso seja citado mais adiante no curso): não seria uma boa prática deixar esse método dentro de uma classe?