Newer
Older
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();
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
);
}
Future<void> delete() async{
deleteDatabase(join(await getDatabasesPath(), eventDatabase)); //NOTE: deletes everything. Just use for debug!
await connect(); //Create a new and empty database
}
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();
for (var event in events) {
ev += jsonEncode(event);
ev += ',';
}
ev = ev.substring(0, ev.length - 1); // Remove last ,