1
0
Fork 0
mirror of https://github.com/Nioux/AideDeJeu.git synced 2025-10-29 22:45:44 +00:00
AideDeJeu/aidedejeu_flutter/lib/databases/database_sqflite.dart

171 lines
5 KiB
Dart
Raw Normal View History

2020-03-22 20:36:08 +01:00
import 'dart:io';
import 'package:aidedejeu_flutter/databases/database.dart';
import 'package:aidedejeu_flutter/models/filters.dart' as Filters;
import 'package:aidedejeu_flutter/models/items.dart';
import 'package:flutter/services.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
class SqfliteDB extends BaseDB {
static SqfliteDB _instance;
2020-03-22 21:20:14 +01:00
2020-03-22 20:36:08 +01:00
static SqfliteDB get instance {
2020-03-22 21:20:14 +01:00
if (_instance == null) {
2020-03-22 20:36:08 +01:00
_instance = SqfliteDB();
}
return _instance;
}
2020-03-22 21:20:14 +01:00
2020-03-22 20:36:08 +01:00
Database _database;
Future<Database> get database async {
if (_database != null) return _database;
_database = await getDatabaseInstance();
return _database;
}
Future<Database> getDatabaseInstance() async {
var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "library.db");
var exists = await databaseExists(path);
exists = false;
if (!exists) {
print("Creating new copy from asset");
try {
await Directory(dirname(path)).create(recursive: true);
} catch (_) {}
ByteData data = await rootBundle.load(join("assets", "library.db"));
List<int> bytes =
2020-03-22 21:20:14 +01:00
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
2020-03-22 20:36:08 +01:00
await File(path).writeAsBytes(bytes, flush: true);
} else {
print("Opening existing database");
}
return await openDatabase(path, readOnly: true);
}
2020-03-22 21:20:14 +01:00
@override
Future<List<Item>> loadAllItems() async {
2020-03-22 20:36:08 +01:00
final db = await database;
var response = await db.query(
2020-03-22 21:20:14 +01:00
"Items",
2020-03-22 20:36:08 +01:00
);
2020-03-22 21:20:14 +01:00
if (response.isNotEmpty) {
return itemsFromMapList(response);
}
return null;
}
@override
Future<Item> getItemWithId(String id) async {
print("getItemWithId " + id);
final db = await database;
var response = await db
.query("Items", where: "Id = ? OR RootId = ?", whereArgs: [id, id]);
2020-03-22 20:36:08 +01:00
if (response.isEmpty) {
print("Id not found");
}
return response.isNotEmpty ? itemFromMap(response.first) : null;
}
2020-03-22 21:20:14 +01:00
@override
Future<Item> loadChildrenItems(
Item item, List<Filters.Filter> filters) async {
2020-03-22 20:36:08 +01:00
print("getChildrenItems " + (item?.itemType ?? ""));
if (item.itemType.endsWith("Items")) {
2020-03-22 21:20:14 +01:00
String itemType = item.itemType.substring(0, item.itemType.length - 1);
2020-03-22 20:36:08 +01:00
String family = "";
if (item is FilteredItems) {
family = item.family ?? "";
}
String whereFilter = "";
if (filters != null) {
filters.forEach((filter) {
if (filter.selectedValues.isNotEmpty) {
whereFilter = " AND (${filter.name} LIKE '%" +
filter.selectedValues.join("%' OR ${filter.name} LIKE '%") +
"%')";
}
2020-03-22 21:20:14 +01:00
if (filter.rangeValues != null &&
(filter.rangeValues.start > 0 ||
filter.rangeValues.end < filter.values.length - 1)) {
2020-03-22 20:36:08 +01:00
whereFilter =
2020-03-22 21:20:14 +01:00
" AND ([${filter.name}] BETWEEN '${filter.values[filter.rangeValues.start.round()]}' AND '${filter.values[filter.rangeValues.end.round()]}')";
2020-03-22 20:36:08 +01:00
}
});
}
print(whereFilter);
final db = await database;
2020-03-22 21:20:14 +01:00
var response = await db.query("Items",
2020-03-22 20:36:08 +01:00
where: "ItemType = ? AND Family = ?" + whereFilter,
whereArgs: [itemType, family],
2020-03-22 21:20:14 +01:00
orderBy: "NormalizedName");
2020-03-22 20:36:08 +01:00
if (response.isEmpty) {
print("Children not found");
}
2020-03-22 21:20:14 +01:00
item.children = response.isNotEmpty ? itemsFromMapList(response) : null;
2020-03-22 20:36:08 +01:00
}
return item;
}
2020-03-22 21:20:14 +01:00
@override
2020-03-22 20:36:08 +01:00
Future<List<RaceItem>> loadRaces() async {
final db = await database;
2020-03-22 21:20:14 +01:00
var response = await db.query("Items",
where: "ItemType = 'RaceItem'", orderBy: "NormalizedName");
2020-03-22 20:36:08 +01:00
if (response.isNotEmpty) {
return itemsFromMapList(response);
}
return null;
}
2020-03-22 21:20:14 +01:00
@override
2020-03-22 20:36:08 +01:00
Future<List<SubRaceItem>> loadSubRaces(RaceItem race) async {
final db = await database;
2020-03-22 21:20:14 +01:00
var response = await db.query("Items",
2020-03-22 20:36:08 +01:00
where: "ItemType = 'SubRaceItem' AND ParentLink = ?",
whereArgs: [race.id],
2020-03-22 21:20:14 +01:00
orderBy: "NormalizedName");
2020-03-22 20:36:08 +01:00
if (response.isNotEmpty) {
return itemsFromMapList(response);
}
return null;
}
2020-03-22 21:20:14 +01:00
@override
2020-03-22 20:36:08 +01:00
Future<List<T>> loadTypedItems<T extends Item>(
{String itemType, Item item}) async {
final db = await database;
2020-03-22 21:20:14 +01:00
var response = await db.query("Items",
2020-03-22 20:36:08 +01:00
where: "ItemType = ?" + (item != null ? " AND ParentLink = ?" : ""),
whereArgs: item != null ? [itemType, item.id] : [itemType],
2020-03-22 21:20:14 +01:00
orderBy: "NormalizedName");
2020-03-22 20:36:08 +01:00
if (response.isNotEmpty) {
return itemsFromMapList(response);
}
return null;
}
2020-05-16 13:12:24 +02:00
@override
Future<List<OriginItem>> loadOrigins() async {
return loadTypedItems<OriginItem>(itemType: "OriginItem");
}
2020-03-22 21:20:14 +01:00
@override
2020-03-22 20:36:08 +01:00
Future<List<BackgroundItem>> loadBackgrounds() async {
return loadTypedItems<BackgroundItem>(itemType: "BackgroundItem");
}
2020-03-22 21:20:14 +01:00
@override
2020-03-22 20:36:08 +01:00
Future<List<SubBackgroundItem>> loadSubBackgrounds(Item item) async {
return loadTypedItems<SubBackgroundItem>(
itemType: "SubBackgroundItem", item: item);
}
2020-03-22 21:20:14 +01:00
}