2020-02-21 14:49:39 +01:00
import ' dart:io ' ;
import ' package:aidedejeu_flutter/models/items.dart ' ;
import ' package:flutter/services.dart ' ;
import ' package:path/path.dart ' ;
import ' package:sqflite/sqflite.dart ' ;
2020-02-29 01:40:05 +01:00
import ' models/filters.dart ' ;
2020-02-21 14:49:39 +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 ) ;
2020-02-22 02:43:08 +01:00
exists = false ;
2020-02-21 14:49:39 +01:00
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 =
data . buffer . asUint8List ( data . offsetInBytes , data . lengthInBytes ) ;
await File ( path ) . writeAsBytes ( bytes , flush: true ) ;
} else {
print ( " Opening existing database " ) ;
}
return await openDatabase ( path , readOnly: true ) ;
}
2020-03-13 09:46:17 +01:00
Future < Item > getItemWithId ( String id ) async {
2020-02-21 14:49:39 +01:00
print ( " getItemWithId " + id ) ;
final db = await database ;
2020-02-22 00:59:48 +01:00
var response = await db . query (
" Items " ,
where: " Id = ? OR RootId = ? " ,
whereArgs: [ id , id ]
) ;
2020-02-21 14:49:39 +01:00
if ( response . isEmpty ) {
print ( " Id not found " ) ;
}
2020-03-13 09:46:17 +01:00
return response . isNotEmpty ? itemFromMap ( response . first ) : null ;
2020-02-21 14:49:39 +01:00
}
2020-03-13 09:46:17 +01:00
Future < Item > loadChildrenItems ( Item item , List < Filter > filters ) async {
2020-02-28 17:59:22 +01:00
print ( " getChildrenItems " + ( item ? . itemType ? ? " " ) ) ;
if ( item . itemType . endsWith ( " Items " ) ) {
2020-02-21 21:28:14 +01:00
String itemType =
2020-02-28 17:59:22 +01:00
item . itemType . substring ( 0 , item . itemType . length - 1 ) ;
2020-02-21 14:49:39 +01:00
String family = " " ;
2020-02-22 00:59:48 +01:00
if ( item is FilteredItems ) {
2020-02-29 01:40:05 +01:00
family = item . family ? ? " " ;
2020-02-21 14:49:39 +01:00
}
2020-02-27 20:48:42 +01:00
String whereFilter = " " ;
if ( filters ! = null ) {
filters . forEach ( ( filter ) {
if ( filter . selectedValues . isNotEmpty ) {
2020-02-27 21:06:57 +01:00
whereFilter = " AND ( ${ filter . name } LIKE '% " + filter . selectedValues . join ( " %' OR ${ filter . name } LIKE '% " ) + " %') " ;
2020-02-27 20:48:42 +01:00
}
2020-02-27 23:30:22 +01:00
if ( filter . rangeValues ! = null & & ( filter . rangeValues . start > 0 | | filter . rangeValues . end < filter . values . length - 1 ) ) {
whereFilter = " AND ([ ${ filter . name } ] BETWEEN ' ${ filter . values [ filter . rangeValues . start . round ( ) ] } ' AND ' ${ filter . values [ filter . rangeValues . end . round ( ) ] } ') " ;
}
2020-02-27 20:48:42 +01:00
} ) ;
}
print ( whereFilter ) ;
2020-02-21 14:49:39 +01:00
final db = await database ;
2020-02-22 00:59:48 +01:00
var response = await db . query (
" Items " ,
2020-02-27 20:48:42 +01:00
where: " ItemType = ? AND Family = ? " + whereFilter ,
2020-02-21 21:28:14 +01:00
whereArgs: [ itemType , family ] ,
2020-02-22 00:59:48 +01:00
orderBy: " NormalizedName "
) ;
2020-02-21 14:49:39 +01:00
if ( response . isEmpty ) {
2020-02-22 00:59:48 +01:00
print ( " Children not found " ) ;
2020-02-21 14:49:39 +01:00
}
2020-02-28 17:59:22 +01:00
item . children = response . isNotEmpty
2020-03-13 09:46:17 +01:00
? itemsFromMapList ( response )
2020-02-21 14:49:39 +01:00
: null ;
}
return item ;
}
2020-03-13 09:46:17 +01:00
Future < List < RaceItem > > loadRaces ( ) async {
2020-03-01 00:27:51 +01:00
final db = await database ;
var response = await db . query (
" Items " ,
where: " ItemType = 'RaceItem' " ,
orderBy: " NormalizedName "
) ;
if ( response . isNotEmpty ) {
2020-03-13 09:46:17 +01:00
return itemsFromMapList ( response ) ;
2020-03-01 00:27:51 +01:00
}
return null ;
}
2020-03-13 09:46:17 +01:00
Future < List < SubRaceItem > > loadSubRaces ( RaceItem race ) async {
2020-03-01 00:27:51 +01:00
final db = await database ;
var response = await db . query (
" Items " ,
where: " ItemType = 'SubRaceItem' AND ParentLink = ? " ,
whereArgs: [ race . id ] ,
orderBy: " NormalizedName "
) ;
if ( response . isNotEmpty ) {
2020-03-13 09:46:17 +01:00
return itemsFromMapList ( response ) ;
2020-03-01 00:27:51 +01:00
}
return null ;
}
2020-03-01 21:30:33 +01:00
2020-03-13 09:46:17 +01:00
Future < List < T > > loadTypedItems < T extends Item > ( { String itemType , Item item } ) async {
2020-03-01 21:30:33 +01:00
final db = await database ;
var response = await db . query (
" Items " ,
where: " ItemType = ? " + ( item ! = null ? " AND ParentLink = ? " : " " ) ,
whereArgs: item ! = null ? [ itemType , item . id ] : [ itemType ] ,
orderBy: " NormalizedName "
) ;
if ( response . isNotEmpty ) {
2020-03-13 09:46:17 +01:00
return itemsFromMapList ( response ) ;
2020-03-01 21:30:33 +01:00
}
return null ;
}
2020-03-13 09:46:17 +01:00
Future < List < BackgroundItem > > loadBackgrounds ( ) async {
return loadTypedItems < BackgroundItem > ( itemType: " BackgroundItem " ) ;
2020-03-01 21:30:33 +01:00
}
2020-03-13 09:46:17 +01:00
Future < List < SubBackgroundItem > > loadSubBackgrounds ( Item item ) async {
return loadTypedItems < SubBackgroundItem > ( itemType: " SubBackgroundItem " , item: item ) ;
2020-03-01 21:30:33 +01:00
}