import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; import 'dart:async'; import 'datamodel.dart'; class DatabaseInstance extends DatabaseConnector { static final DatabaseInstance _instance = DatabaseInstance ._internal(); factory DatabaseInstance() { return _instance; } DatabaseInstance._internal(); } abstract class DatabaseConnector{ static const String eventDatabase = 'mobileEventLogWithData.db'; static const String eventTable = 'events'; dynamic database; Future<void> connect() async { database = await openDatabase( join(await getDatabasesPath(), eventDatabase), // When the database is first created, create a table to store the events. onCreate: (db, version) { return db.execute( 'CREATE TABLE $eventTable(id INTEGER PRIMARY KEY, urnId INTEGER, urn TEXT, label TEXT, type TEXT, typeId INTEGER, description TEXT, status TEXT, startDate TEXT, endDate TEXT, latitude REAL, longitude REAL, elevation REAL, data TEXT)', ); }, // Set the version. This executes the onCreate function and provides a // path to perform database upgrades and downgrades version: 1, ); } Future<void> delete() async{ deleteDatabase(join(await getDatabasesPath(), eventDatabase)); //NOTE: deletes everything. Just use for debug! await connect(); //Create a new and empty database } Future<int> addEvent(Event event) async { int rowId = 0; rowId = await database.insert( eventTable, event.toMapNoId(), conflictAlgorithm: ConflictAlgorithm.fail, ); return rowId; } // Ensure the events id is the correct row id! Future<int> updateEvent(Event event) async { int rowId = 0; rowId = await database.insert( eventTable, event.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); debugPrint("Updated Event in Database: " + event.toString()); return rowId; } Future<List<Event>> getEvents() async { final List<Map<String, dynamic>> maps = await database.query(eventTable); // Convert the List<Map<String, dynamic> into a List<Event>. return List.generate(maps.length, (i) { return Event( id: maps[i]['id'], urnId: maps[i]['urnId'], urn: maps[i]['urn'], label: maps[i]['label'], type: maps[i]['type'], typeId: maps[i]['typeId'], description: maps[i]['description'], status: maps[i]['status'], startDate: maps[i]['startDate'], endDate: maps[i]['endDate'], latitude: maps[i]['latitude'].toString(), //TODO: change datamodel to double values! longitude: maps[i]['longitude'].toString(), elevation: maps[i]['elevation'].toString(), data: maps[i]['data'], ); }); } Future<int> getPendingEventCnt() async { List<Event> events = await getPendingEvents(); return events.length; } // A method that retrieves all the dogs from the dogs table. Future<List<Event>> getPendingEvents() async { final List<Map<String, dynamic>> maps = await database.query(eventTable, where: 'status = ?', whereArgs: ['PENDING']); // Convert the List<Map<String, dynamic> into a List<Event>. return List.generate(maps.length, (i) { return Event( id: maps[i]['id'], urnId: maps[i]['urnId'], urn: maps[i]['urn'], label: maps[i]['label'], type: maps[i]['type'], typeId: maps[i]['typeId'], description: maps[i]['description'], status: maps[i]['status'], startDate: maps[i]['startDate'], endDate: maps[i]['endDate'], latitude: maps[i]['latitude'].toString(), //TODO: change datamodel to double longitude: maps[i]['longitude'].toString(), elevation: maps[i]['elevation'].toString(), data: maps[i]['data'], ); }); } // Create a json readable event dump Future<String> eventDump() async { List<Event> events = await getEvents(); var ev = '['; for (var event in events) { ev += jsonEncode(event); ev += ','; } ev = ev.substring(0, ev.length - 1); // Remove last , ev += ']'; return ev; } }