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, and AVG.
  • 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.