Here's the updated README with the name changed to "EasySqfliteORM":
EasySqfliteORM
EasySqfliteORM is a simple and dynamic SQLite ORM (Object-Relational Mapping) solution for Flutter. It helps developers interact with SQLite databases without writing raw SQL. This package supports common database operations such as CRUD, table creation, batch operations, transactions, and more.
Features
- Dynamic Table Creation: Create tables dynamically as needed.
- CRUD Operations: Perform standard database operations such as insert, query, update, and delete.
- One-to-One, One-to-Many, and Many-to-Many Relationships: Easily set up relationships between tables.
- Batch Operations: Perform bulk inserts and batch processing.
- Transaction Support: Ensure atomicity with transaction management.
- Join Queries and Pagination: Execute join queries and paginate results.
- Aggregate Functions: Use functions like
SUM
,MIN
,MAX
, andAVG
. - Index Creation: Optimize query performance by creating indexes.
Getting Started
1. Add Dependency
First, add the sqflite
and path
packages to your pubspec.yaml
:
dependencies:
sqflite: ^2.0.0+3
path: ^1.8.1
2. Initialize the ORM
Before performing any database operations, you need to initialize EasySqfliteORM with the database name:
import 'package:easy_sqflite_orm/easy_sqflite_orm.dart';
void main() async {
await EasySqfliteORM.init('my_database.db');
runApp(MyApp());
}
3. Create Tables
You can create tables dynamically by specifying the table name and column definitions:
await EasySqfliteORM().createTable(
'users',
{'id': 'INTEGER PRIMARY KEY', 'name': 'TEXT', 'age': 'INTEGER'},
);
4. Insert Data
To insert data into a table:
await EasySqfliteORM().insert('users', {'name': 'John Doe', 'age': 30});
5. Query Data
You can query data with various options like filtering, limiting, and offsetting:
List<Map<String, dynamic>> users = await EasySqfliteORM().query('users');
6. Update Data
To update existing records:
await EasySqfliteORM().update(
'users',
{'name': 'John Smith'},
'id = ?',
[1],
);
7. Delete Data
To delete records:
await EasySqfliteORM().delete('users', 'id = ?', [1]);
Advanced Usage
One-to-One Relationship
To create a one-to-one relationship between tables:
await EasySqfliteORM().createOneToOneTable(
'profiles',
'users',
'user_id',
{'id': 'INTEGER PRIMARY KEY', 'bio': 'TEXT'},
);
One-to-Many Relationship
To create a one-to-many relationship:
await EasySqfliteORM().createOneToManyTable(
'posts',
'users',
'user_id',
{'id': 'INTEGER PRIMARY KEY', 'content': 'TEXT'},
);
Many-to-Many Relationship
To create a many-to-many relationship using a junction table:
await EasySqfliteORM().createManyToManyTable(
'user_roles',
'users',
'roles',
'user_id',
'role_id',
);
Transactions
Perform a transaction:
await EasySqfliteORM().transaction((txn) async {
await txn.insert('users', {'name': 'Alice', 'age': 25});
await txn.insert('users', {'name': 'Bob', 'age': 28});
});
Batch Operations
Use batch processing to perform multiple operations at once:
await EasySqfliteORM().performBatch((batch) {
batch.insert('users', {'name': 'Charlie', 'age': 32});
batch.update('users', {'age': 33}, 'name = ?', ['Charlie']);
});
Aggregate Functions
Get the sum of a column:
int? totalAge = await EasySqfliteORM().sum('users', 'age');
Pagination
Retrieve paginated results:
List<Map<String, dynamic>> pageResults = await EasySqfliteORM().paginate('users', 10, 0); // Page 1
Join Queries
Perform an inner join between two tables:
List<Map<String, dynamic>> result = await EasySqfliteORM().joinQuery(
'users',
'profiles',
'users.id = profiles.user_id',
);
Index Creation
Create an index on a table column:
await EasySqfliteORM().createIndex('users', 'name');
Example App
Here is a sample Flutter app that demonstrates how to use EasySqfliteORM:
import 'package:flutter/material.dart';
import 'package:easy_sqflite_orm/easy_sqflite_orm.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasySqfliteORM.init('my_database.db');
await EasySqfliteORM().createTable(
'users',
{'id': 'INTEGER PRIMARY KEY', 'name': 'TEXT', 'age': 'INTEGER'},
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'EasySqfliteORM Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: UserListScreen(),
);
}
}
class UserListScreen extends StatefulWidget {
@override
_UserListScreenState createState() => _UserListScreenState();
}
class _UserListScreenState extends State<UserListScreen> {
List<Map<String, dynamic>> _users = [];
@override
void initState() {
super.initState();
_fetchUsers();
}
Future<void> _fetchUsers() async {
List<Map<String, dynamic>> users = await EasySqfliteORM().query('users');
setState(() {
_users = users;
});
}
Future<void> _addUser(String name, int age) async {
await EasySqfliteORM().insert('users', {'name': name, 'age': age});
_fetchUsers();
}
Future<void> _updateUser(int id, String newName, int newAge) async {
await EasySqfliteORM().update(
'users',
{'name': newName, 'age': newAge},
'id = ?',
[id],
);
_fetchUsers();
}
Future<void> _deleteUser(int id) async {
await EasySqfliteORM().delete('users', 'id = ?', [id]);
_fetchUsers();
}
void _showAddUserDialog() {
String name = '';
int age = 0;
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Add User'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
onChanged: (value) => name = value,
decoration: InputDecoration(labelText: 'Name'),
),
TextField(
onChanged: (value) => age = int.tryParse(value) ?? 0,
keyboardType: TextInputType.number,
decoration: InputDecoration(labelText: 'Age'),
),
],
),
actions: [
TextButton(
onPressed: () {
_addUser(name, age);
Navigator.of(context).pop();
},
child: Text('Add'),
),
],
);
},
);
}
void _showUpdateUserDialog(int id, String currentName, int currentAge) {
String newName = currentName;
int newAge = currentAge;
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Update User'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
onChanged: (value) => newName = value,
decoration: InputDecoration(labelText: 'Name'),
controller: TextEditingController(text: currentName),
),
TextField(
onChanged: (value) => newAge = int.tryParse(value) ?? 0,
keyboardType: TextInputType.number,
decoration: InputDecoration(labelText: 'Age'),
controller: TextEditingController(text: currentAge.toString()),
),
],
),
actions: [
TextButton(
onPressed: () {
_updateUser(id, newName, newAge);
Navigator.of(context).pop();
},
child: Text('Update'),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('User List'),
),
body: ListView.builder(
itemCount: _users.length,
itemBuilder: (context, index) {
final user = _users[index];
return ListTile(
title: Text('${user['name']} (Age: ${user['age']})'),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.edit),
onPressed: () =>
_showUpdateUserDialog(user['id'], user['name'], user['age']),
),
IconButton(
icon: Icon(Icons.delete),
onPressed: () => _deleteUser(user['id']),
),
],
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: _showAddUserDialog,
child: Icon(Icons.add),
),
);
}
}
License
This project is licensed under the MIT License.