1
resposta

[Dúvida] Problema ao criar tabela para o banco de dados Flutter

import 'package:app_bd4/database/userdao.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart';

Future getDatabase()async{

return openDatabase(join(await getDatabasesPath(),'users.db'),

onCreate: (db, version) { print(getDatabasesPath()); return db.execute(UsersDao.tableSql); },

version: 1, );

}

import 'package:sqflite/sqflite.dart';

import 'package:path/path.dart'; import 'package:app_bd4/database/data.dart'; class UsersDao{ static const String tableSql = 'CREATE TABLE $_tablename(''id INTEGER PRIMARY KEY,' '$_name TEXT,' '$_idade TEXT)';

static const String _tablename = 'userstable';
static const String _name = 'name';
static const String _idade = '2';

// função para salvar um usuario
salvar(Users usuario)async{
  print('iniciando o salvamento ');
  print(getDatabasesPath());
  final Database bd = await getDatabase();
  var itemExists = await find(usuario.name);
  Map<String,dynamic>usuarioMap = toMap(usuario);
  if(itemExists.isEmpty){
    print('O usuario nao existia');
    return await bd.insert(_tablename,usuarioMap,conflictAlgorithm: ConflictAlgorithm.replace);
  }
  else{
    print('O usuario existia');
    return await bd.update(_tablename, usuarioMap,where: '$_name',whereArgs: [usuario.name]);
  }
 
}
Map<String,dynamic> toMap(Users usuario){
  print('Convertendo para Map');
  final Map<String,dynamic> usuarioMap= Map();
  usuarioMap[_name] = usuario.name.toString();
  usuarioMap[_idade] = usuario.idade.toString();
  print('$usuarioMap');
  return  usuarioMap;
}
Future <List<Users>> findAll()async{
  print('Acessando o find all');
  final Database bd = await getDatabase();
  final List <Map<String,dynamic>> result = await bd.query(_tablename);
  print('Procurando dados no banco $result');
  return toList(result);

}
List<Users> toList(List<Map<String,dynamic>> mapadeusuarios){
  print('Convertendo to list');
  final List<Users> usuarios =[];
  for(Map<String,dynamic> linha in mapadeusuarios){
    final Users usuario = Users(linha[_name],linha[_idade]);
    usuarios.add(usuario);
  }
  print('Lista de usuarios ${usuarios.toString()}');
  return usuarios;
}
Future<List<Users>> find(String nomeusuario)async{
  print('Acessando o find');
  final Database bd  = await getDatabase();
  print('Procurando o usuario ${nomeusuario}');
  final List<Map<String,dynamic>> result = await bd.query(_tablename,where: '$_name = ?',whereArgs: [nomeusuario]);
  print('Usuario encontrado: ${toList(result)}');
  return toList(result);


}
delete(String nomeusuario)async{
  print('Deletando usuario ${nomeusuario}');
  final Database bd = await getDatabase();
  return await bd.delete(_tablename,where: '$_name = ? ',whereArgs: [nomeusuario]);

}

}

class Users{ String name; String idade; Users(this.name, this.idade); }

import 'package:app_bd4/database/userdao.dart';

import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart';

void main() { runApp(MaterialApp( home: Home(),), ); }

class Home extends StatefulWidget { const Home({super.key});

@override State createState() => _HomeState(); }

class _HomeState extends State { Users daniel = Users('Daniel', '28'); Map<String,dynamic> Daniel ={ 'name':'Daniel', 'idade': '28' }; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text( 'App BD 2' ) ), body: Column( children: [ Text('Banco de dados'), ElevatedButton(onPressed: (){ WidgetsFlutterBinding.ensureInitialized(); UsersDao().salvar(Users("Daniel", "28"));

      }, child: Text('Salvar')),
      ElevatedButton(onPressed: (){
        UsersDao().findAll();

      }, child: Text('Exibir'))
    ],
  ),
);

} }

Dá um try exception dizendo que está no formato incorreto para salvar os dados
1 resposta

Olá, Daniel.

Tudo bem?

Parece que você está enfrentando um problema com a criação de tabelas no seu banco de dados SQLite no Flutter. Vamos tentar resolver isso juntos!

Primeiramente, percebi um pequeno erro na definição da sua tabela SQL que pode estar causando o problema. Na sua classe UsersDao, você definiu o campo _idade como uma constante de valor '2', o que não parece correto, já que você provavelmente quer que este campo armazene a idade do usuário, que seria um valor variável e não uma constante.

Aqui está a correção para a declaração da sua tabela:

class UsersDao {
  static const String _tablename = 'userstable';
  static const String _name = 'name';
  static const String _idade = 'idade'; // Alterado para 'idade'

  static const String tableSql = 'CREATE TABLE $_tablename('
      'id INTEGER PRIMARY KEY,'
      '$_name TEXT,'
      '$_idade TEXT)'; // Garante que a idade seja armazenada como texto, conforme seu modelo de dados
}

Além disso, recomendo envolver a chamada ao método salvar dentro de um bloco try-catch para capturar e entender melhor qualquer exceção que possa estar ocorrendo. Isso pode ajudar a identificar outros possíveis erros que não sejam imediatamente óbvios. Veja como você pode fazer isso:

ElevatedButton(onPressed: () {
  WidgetsFlutterBinding.ensureInitialized();
  try {
    UsersDao().salvar(Users("Daniel", "28"));
  } catch (e) {
    print('Ocorreu um erro ao salvar: $e');
  }
}, child: Text('Salvar'))

Esse bloco try-catch vai capturar qualquer exceção lançada pelo método salvar e imprimir no console, o que pode dar mais pistas se ainda houver algo errado.

Espero que essas alterações ajudem a resolver o problema com a criação e manipulação da tabela no seu banco de dados. Teste essas mudanças e veja se o problema com o formato incorreto para salvar os dados é resolvido.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software