Skip to content
Snippets Groups Projects
databaseconnector.dart 3.95 KiB
import 'dart:convert';
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 = 'mobileEventLog.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)',
        );
      },
      // 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,
    );
    return rowId;
  }

  Future<List<Event>> getEvents() async {
    final List<Map<String, dynamic>> maps = await database.query(eventTable);