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
+10 -1
View File
@@ -13,7 +13,7 @@ export 'presentation/utils/theme_utils.dart';
export 'presentation/utils/responsive_utils.dart';
export 'presentation/utils/keyboard_utils.dart';
export 'presentation/utils/style_utils.dart';
export 'presentation/extensions/list_extensions.dart';
export 'presentation/utils/app_toast.dart';
// Views
export 'presentation/views/text/slogan_builder.dart';
@@ -49,3 +49,12 @@ export 'presentation/state/app_state.dart';
// Validator
export 'presentation/validator/html_message_purifier.dart';
// Local
export 'data/local/config/database_config.dart';
export 'data/local/config/email_address_table.dart';
export 'data/local/database_client.dart';
export 'data/local/database_manager.dart';
// Model
export 'data/model/data_source_type.dart';
@@ -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
}
@@ -52,4 +52,7 @@ extension AppColor on Color {
static const enableSendEmailButtonColor = Color(0xFF3840F7);
static const disableSendEmailButtonColor = Color(0xFFACAFFF);
static const borderLeftEmailContentColor = Color(0xFFEFEFEF);
static const toastBackgroundColor = Color(0xFFACAFFF);
static const toastSuccessBackgroundColor = Color(0xFF04AA11);
static const toastErrorBackgroundColor = Color(0xFFFF5858);
}
@@ -0,0 +1,35 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
class AppToast {
void showToast(String message) {
Fluttertoast.showToast(
msg: message,
fontSize: 16,
textColor: Colors.white,
backgroundColor: AppColor.toastBackgroundColor,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM);
}
void showSuccessToast(String message) {
Fluttertoast.showToast(
msg: message,
fontSize: 16,
textColor: Colors.white,
backgroundColor: AppColor.toastSuccessBackgroundColor,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM);
}
void showErrorToast(String message) {
Fluttertoast.showToast(
msg: message,
fontSize: 16,
textColor: Colors.white,
backgroundColor: AppColor.toastErrorBackgroundColor,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM);
}
}
+6 -2
View File
@@ -44,11 +44,15 @@ dependencies:
html: 0.15.0
# fluttertoast
fluttertoast: 8.0.8
# sqflite
sqflite: 2.0.0+4
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: 2.0.5
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec