Skip to content
Snippets Groups Projects
databaseconnector.dart 4.19 KiB
Newer Older
Maximilian Betz's avatar
Maximilian Betz committed
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'dart:async';
import 'datamodel.dart';

Maximilian Betz's avatar
Maximilian Betz committed
class DatabaseInstance extends DatabaseConnector {
  static final DatabaseInstance _instance = DatabaseInstance
      ._internal();
Maximilian Betz's avatar
Maximilian Betz committed
  factory DatabaseInstance() {
    return _instance;
  }

  DatabaseInstance._internal();
Maximilian Betz's avatar
Maximilian Betz committed
}


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
Maximilian Betz's avatar
Maximilian Betz committed
      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
  }

Maximilian Betz's avatar
Maximilian Betz committed
  Future<int> addEvent(Event event) async {
Maximilian Betz's avatar
Maximilian Betz committed
    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());

  Future<List<Event>> getEvents() async {
Maximilian Betz's avatar
Maximilian Betz committed
    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(),
Maximilian Betz's avatar
Maximilian Betz committed
  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 {
Maximilian Betz's avatar
Maximilian Betz committed
    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'],
Maximilian Betz's avatar
Maximilian Betz committed
        latitude: maps[i]['latitude'].toString(),  //TODO: change datamodel to double
        longitude: maps[i]['longitude'].toString(),
        elevation: maps[i]['elevation'].toString(),
Maximilian Betz's avatar
Maximilian Betz committed

  // Create a json readable event dump
  Future<String> eventDump() async {
    List<Event> events = await getEvents();
Maximilian Betz's avatar
Maximilian Betz committed
    for (var event in events) {
      ev += jsonEncode(event);
      ev += ',';
    }
    ev = ev.substring(0, ev.length - 1); // Remove last ,
Maximilian Betz's avatar
Maximilian Betz committed
    ev += ']';
Maximilian Betz's avatar
Maximilian Betz committed
    return ev;
Maximilian Betz's avatar
Maximilian Betz committed
  }