SQLite Flutter

1. Dependency

Khai báo Dependency 3 thư viện sqflite_common_ffi để sử dụng sqlite, path để sử dụng hàm join các đường dẫn tập tin và thư mục, cuối cùng là thư viện Bcrypt với nội dung như sau

name: sqlite_app
version: 1.0.0
environment:
  sdk: '^3.13.0'
dependencies:
  sqflite_common_ffi: ^2.4.3
  path: ^1.9.1
  bcrypt: ^1.2.0

2. DbHelper


class DbHelper {
  DbHelper._init();
  static DbHelper instance = DbHelper._init();
  Database? _database;
  void _create_db(Database db) async {
    await db.execute("""
      CREATE TABLE member(
        id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL,
        password TEXT NOT NULL,
        role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('member', 'customer', 'admin'))
      );""");
    await db.insert('member', {
      'name': 'teo',
      'email': 'teo@ceb.net.vn',
      'password': BCrypt.hashpw('123', BCrypt.gensalt()),
      'role': 'admin',
    });
    await db.insert('member', {
      'name': 'ti',
      'email': 'ti@ceb.net.vn',
      'password': BCrypt.hashpw('123', BCrypt.gensalt()),
      'role': 'customer',
    });
    await db.insert('member', {
      'name': 'sau',
      'email': 'sau@ceb.net.vn',
      'password': BCrypt.hashpw('123', BCrypt.gensalt()),
      'role': 'member',
    });
  }
  Future<Database> _init_db() async {
    String path = join(await getDatabasesPath(), 'store.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: ((db, version) => _create_db(db)),
    );
  }
  Future<Database> get database async {
    _database ??= await _init_db();
    return _database!;
  }
}

3. Init Database


void main() async {
  sqfliteFfiInit();
  databaseFactory = databaseFactoryFfi;
}

4. class Member


class Member {
  final int id;
  final String name;
  final String email;
  final String password;
  final String role;
  Member({
    required this.id,
    required this.name,
    required this.email,
    required this.password,
    required this.role,
  });
  factory Member.fromMap(Map<String, dynamic> map) {
    return Member(
      id: map['id'],
      name: map['name'],
      email: map['email'],
      password: map['password'],
      role: map['role'],
    );
  }
}

5. Function login


Future<Member> login(String email, String password) async {
  Database db = await DbHelper.instance.database;
  var data = await db.query('member', where: 'email = ?', whereArgs: [email]);
  if (data.isNotEmpty) {
    Member member = data.map(Member.fromMap).first;
    if (BCrypt.checkpw(password, member.password)) {
      return member;
    }
    throw Exception("Password invalid");
  }
  throw Exception('Email not exists');
}

6. Calling login


void main() async {
  try {
    Member member = await login('teo@ceb.net.vn', '123');
    print(member.email);
  } catch (ex) {
    print(ex);
  }
}