
flutter_entify é um package baseado no .NET Entity Framework, com ele é possível de forma simplificada criar um banco de dados, mapear entidades para o banco de dados e executar queries. Além disso fornece suporte para transações e migrations e classes auxiliares para realizar operações de CRUD.
🚀 Features
-
🛠️ Operações CRUD simplificadas.
-
🔎 Helpers para execução de queries SQL.
-
🔄 Criação de mapeamentos entre classes e suas tabelas no banco.
-
🔁 Suporte a transações para garantir a integridade dos dados.
-
📜 Migrations para versionamento do banco de dados.
-
⚡ AutoMigrations para atualização automática do esquema do banco.
📌 Instalação
Adicione o flutter_entify ao seu projeto usando o pub.flutter-io.cn:
flutter pub add flutter_entify
ou no pubspec.yaml:
dependencies:
flutter_entify: ^0.0.1
Getting started
Antes de usar o flutter_entify, é necessário configurar o DbContext, que será responsável pela comunicação com o banco de dados.
1️⃣ Criando uma Entidade
Primeiro, defina sua entidade de domínio:
class Example {
int id;
String name;
Example({required this.id, required this.name});
}
2️⃣ Criando o DbContext
Para configurar o banco de dados e gerenciar entidades, crie uma classe que estenda DbContext. Isso permitirá definir os DbSets e sobrescrever os métodos onConfiguring para configurar a conexão e o comportamento do banco e configureEntites para declarar as entidades do banco.
class AppDbContext extends DbContext {
final example = DbSet<Example>();
@override
List<DbSet> get dbSets => [example];
@override
void onConfiguring(DbContextOptionsBuilder optionsBuilder) {
optionsBuilder
.databaseName('example')
.version(1)
//.migrations([MigrationV1()]); // Para usar migrations manuais, descomente esta linha
.withAutoMigrations();
super.onConfiguring(optionsBuilder);
}
@override
List<DbEntity> configureEntites(DbEntityBuilderProvider provider) => [
provider
.getDefaultDbEntityBuilder<Example>()
//Se você quiser alterar o nome da tabela, por padrão será o nome da entidade
//.name('example_table')
.mapToEntity((map) =>Example(id: map['id'] as int, name: map['name'] as String))
.toUpdateOrInsert((e) => {'id': e.id, 'name': e.name})
.primaryKey((e) => {'id': e.id})
.columns(
[
IntColumn(name: 'id', isPrimaryKey: true, isNullable: false),
TextColumn(name: 'name', isNullable: false),
],
).build()
];
}
📝 Migrations
Se não quiser usar AutoMigrations, crie uma classe de migration para cada versão do banco.
class MigrationV1 extends CreateMigration {
@override
void execute(BatchSchemaExecutor executor) {
executor.execute('''
CREATE TABLE Example (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
''');
}
}
class MigrationV2 extends UpdateMigration {
@override
int get version => 2;
@override
void execute(BatchSchemaExecutor executor) {
executor.execute('''
CREATE TABLE Example2 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
description TEXT NOT NULL
);
''');
}
}
📌 Uso (CRUD Básico)
Antes de realizar operações no banco de dados, inicialize o DbContext:
final dbContext = AppDbContext();
await dbContext.initialize();
📝 Criação (INSERT)
// Criação de um novo registro
final example = Example(id: -1, name: 'example');
final insertedId = await dbContext.example.insertAsync(example);
example.id = insertedId;
✏️ Atualização (UPDATE)
// Atualização
example.name = 'Updated name';
await dbContext.example.updateAsync(example);
🔍 Consulta (SELECT)
// Busca um registro específico pela entidade
await dbContext.example.selectAsync(example);
// Busca o primeiro registro que atenda à condição
await dbContext.roles.findFirstOrNull('id = ?', [insertedId]);
// Retorna todos os registros da tabela
await dbContext.roles.findAll();
🗑️ Remoção (DELETE)
//Remove a entidade do banco de dados
dbContext.example.deleteAsync(example);
📌 Exemplos de uso com transações estão disponíveis na aba Example.
🚀 Próximos Updates
-
🔗 Relacionamento entre entidades
-
✨ Geração automática das EntityDefinition do DbContext
-
🔍🛢️ Database inspector extension para visualização do banco de dados