import 'dart:async'; import 'package:flutter/widgets.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // Abre o banco, a partir de agora vamos utilizar o banco por esta variável. final Future database = openDatabase( // Configura o caminho para o banco de dados. OBS: usar a função "join" da // biblioteca "path" é a melhor prática para garantir que o caminho estará // correto, independte do SO. join(await getDatabasesPath(), 'doggie_database.db'), // Quando o banco de dados for criado pela primeira vez, será criada a // tabela "dogs". onCreate: (db, version) { return db.execute( "CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)", ); }, // Indica a versão da base de dados utilizada. Como aqui a versão está em 1, // será executada a função onCreate anterior. version: 1, ); Future insertDog(Dog dog) async { // Obtém a referência ao banco de dados atual, salvando-a na variável db. final Database db = await database; // Insere no banco o objeto "dog" passado como parâmetro para. // Caso o mesmo cachorro (mesmo identificador) seja inserido mais de uma // vez no banco, "ConflictAlgorithm.replace" indica que o dado novo vai // substituir o anterior no banco. await db.insert( 'dogs', dog.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); } Future> dogs() async { // Obtém a referência ao banco de dados conectado, salvando-a na variável db. final Database db = await database; // Executa uma consulta no banco que obtém todos os cachorros cadastrados. final List> maps = await db.query('dogs'); // Converte o resultado acima em uma lista de objetos da classe Dog. return List.generate(maps.length, (i) { return Dog( id: maps[i]['id'], name: maps[i]['name'], age: maps[i]['age'], ); }); } Future updateDog(Dog dog) async { // Obtém a referência ao banco de dados conectado, salvando-a na variável db. final db = await database; // Atualiza no banco os dados do cachorro passado como parâmetro. await db.update( 'dogs', dog.toMap(), // Cláusula where para garantir que o dado atualizado é do registro correto. where: "id = ?", // Passa o id do registro a ser atualizado em whereArg para evitar SQL injection. whereArgs: [dog.id], ); } Future deleteDog(int id) async { // Obtém a referência ao banco de dados conectado, salvando-a na variável db. final db = await database; // Remove do banco o cachorro de id igual ao informado em parâmetro. await db.delete( 'dogs', // Cláusula where para garantir que o dado removido é do registro correto. where: "id = ?", // Passa o id do registro a ser removido em whereArg para evitar SQL injection. whereArgs: [id], ); } // Cria um objeto de teste. var fido = Dog( id: 0, name: 'Fido', age: 35, ); // Solicita a inserção do objeto fido no banco. await insertDog(fido); // Solicita a impressão de todos os cachorros cadastrados no banco (somente fido). print(await dogs()); // Atualiza o atributo idade do objeto Fido e solicita atualização no banco. fido = Dog( id: fido.id, name: fido.name, age: fido.age + 7, ); await updateDog(fido); // Imprime os dados atuais do objeto Fido. print(await dogs()); // Deleta o registro do objeto Fido do banco. await deleteDog(fido.id); // Solicita a impressão de todos os cachorros cadastrados no banco (nenhum). print(await dogs()); } class Dog { final int id; final String name; final int age; Dog({this.id, this.name, this.age}); Map toMap() { return { 'id': id, 'name': name, 'age': age, }; } // Implementa o método toString na classe para facilitar a impressão dos // atributos de um objeto desta classe. @override String toString() { return 'Dog{id: $id, name: $name, age: $age}'; } }