TF-48 Setup database manager for local data

This commit is contained in:
dab246
2021-09-08 15:08:48 +07:00
committed by Dat H. Pham
parent 63702035c8
commit 18d0206c44
9 changed files with 201 additions and 3 deletions
@@ -0,0 +1,5 @@
class DatabaseConfig {
static final String databaseName = 'TMailDatabase.db';
static final int databaseVersion = 1;
}
@@ -0,0 +1,12 @@
class EmailAddressTable {
static const String TABLE_NAME = 'EmailAddress';
static const String EMAIL = 'email';
static const String NAME = 'name';
static const String CREATE = '''CREATE TABLE IF NOT EXISTS $TABLE_NAME (
$EMAIL TEXT PRIMARY KEY,
$NAME TEXT
)''';
}
+109
View File
@@ -0,0 +1,109 @@
import 'dart:io';
import 'package:core/data/local/config/database_config.dart';
import 'package:core/data/local/config/email_address_table.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseClient {
Database? _database;
Batch? _batch;
Future<Database> get database async {
return _database ?? await _initDatabase();
}
Future<Batch> get batch async {
return _batch ?? (await database).batch();
}
Future<Database> _initDatabase() async {
final databasePath = await getDatabasesPath();
final path = join(databasePath, DatabaseConfig.databaseName);
return await openDatabase(
path,
version: DatabaseConfig.databaseVersion,
onOpen: (db) {},
onCreate: (db, version) async {
final batch = db.batch();
batch.execute(EmailAddressTable.CREATE);
await batch.commit();
},
onUpgrade: (db, oldVersion, newVersion) async {});
}
Future closeDatabase() async {
final db = await database;
_database = null;
await db.close();
}
Future<int> insertData(String tableName, Map<String, dynamic> mapObject) async {
final db = await database;
return await db.insert(tableName, mapObject);
}
Future<int> deleteData(String tableName, String key, String value) async {
final db = await database;
return await db.delete(
tableName,
where: '$key = ?',
whereArgs: [value]);
}
Future<int> updateData(String tableName, String key, String value, Map<String, dynamic> mapObject) async {
final db = await database;
return await db.update(
tableName,
mapObject,
where: '$key = ?',
whereArgs: [value]);
}
Future<List<Map<String, dynamic>>> getData(String tableName, String key, String value) async {
final db = await database;
return await db.query(
tableName,
where: '$key = ?',
whereArgs: [value]);
}
Future<List<Map<String, dynamic>>> getListData(String tableName, {int? limit, String? orderBy}) async {
final db = await database;
return await db.query(tableName, limit: limit, orderBy: orderBy);
}
Future deleteLocalFile(String localPath) async {
final fileSaved = File(localPath);
final fileExist = await fileSaved.exists();
if (fileExist) {
await fileSaved.delete();
}
}
Future<List<Map<String, dynamic>>> getListDataWithCondition(String tableName, String condition, List<dynamic> values, {int? limit, String? orderBy}) async {
final db = await database;
return await db.query(
tableName,
where: condition,
whereArgs: values,
limit: limit,
orderBy: orderBy);
}
Future<List<Map<String, dynamic>>> getDataBySql(String sql) async {
final db = await database;
return await db.rawQuery(sql);
}
Future<List<Object?>> insertMultipleData(String tableName, List<Map<String, dynamic>?> mapObjects) async {
final batchInsert = await batch;
mapObjects.forEach((element) {
if (element != null) {
batchInsert.insert(tableName, element);
}
});
return await batchInsert.commit(noResult: false, continueOnError: true);
}
}
+16
View File
@@ -0,0 +1,16 @@
abstract class DatabaseManager<T> {
Future<bool> insertData(T newObject);
Future<bool> insertMultipleData(List<T> listObject);
Future<bool> deleteData(String key);
Future<bool> updateData(T newObject);
Future<T?> getData(String key);
Future<List<T>> getListData({String? word, int? limit, String? orderBy});
Future<List<T>> getListDataWithCondition(String condition, {String? word, int? limit, String? orderBy});
}
@@ -0,0 +1,5 @@
enum DataSourceType {
network,
local
}