From 1c7b0d04f0e915126a7bb7ec089d1b56ad0acb32 Mon Sep 17 00:00:00 2001
From: Maximilian Betz <Maximilian.Betz@awi.de>
Date: Tue, 29 Mar 2022 17:54:01 +0200
Subject: [PATCH] some more steps towards a database solution. Untested

---
 lib/addevent.dart          |  2 ++
 lib/databaseconnector.dart | 37 ++++++++++++++++++++++++++++++++++---
 lib/viewevents.dart        |  6 ++++--
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/lib/addevent.dart b/lib/addevent.dart
index d42acfe..0f45a65 100644
--- a/lib/addevent.dart
+++ b/lib/addevent.dart
@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
 import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 import 'datamodel.dart';
+import 'databaseconnector.dart';
 import 'dart:async';
 import 'package:geolocator/geolocator.dart';
 
@@ -179,6 +180,7 @@ class _AddEventPageState extends State<AddEvent>  {
             longitude: eventsStore.currentEvent.longitude,
             elevation: eventsStore.currentEvent.elevation
         ));
+
   }
 
   @override
diff --git a/lib/databaseconnector.dart b/lib/databaseconnector.dart
index 199b0c0..2462a6c 100644
--- a/lib/databaseconnector.dart
+++ b/lib/databaseconnector.dart
@@ -4,11 +4,14 @@ import 'package:path/path.dart';
 import 'dart:async';
 import 'datamodel.dart';
 
+
+
 class DatabaseConnector{
-  static const String eventDatabase = 'sensor_events.db';
+  static const String eventDatabase = 'mobileEventLog.db';
   static const String eventTable = 'events';
   dynamic database;
 
+
   Future<void> connect() async {
     database = openDatabase(
 
@@ -16,7 +19,6 @@ class DatabaseConnector{
 
       // When the database is first created, create a table to store the events.
       onCreate: (db, version) {
-        // Run the CREATE TABLE statement on the database.
         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)',
         );
@@ -28,6 +30,7 @@ class DatabaseConnector{
   }
 
 
+  //Can also be used to update an existing event. In this case ensure that id is not 0!
   Future<void> insertEvent(Event event) async {
       final db = await database;
       await db.insert(
@@ -37,7 +40,7 @@ class DatabaseConnector{
       );
   }
 
-  // A method that retrieves all the dogs from the dogs table.
+
   Future<List<Event>> getEvents() async {
     // Get a reference to the database.
     final db = await database;
@@ -64,6 +67,34 @@ class DatabaseConnector{
     });
   }
 
+
+  // A method that retrieves all the dogs from the dogs table.
+  Future<List<Event>> getPendingEvents() async {
+    // Get a reference to the database.
+    final db = await database;
+
+    final List<Map<String, dynamic>> maps = await db.query(eventTable, where: '"status" = "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'],
+        longitude: maps[i]['longitude'],
+        elevation: maps[i]['elevation'],
+      );
+    });
+  }
+
 }
 
 
diff --git a/lib/viewevents.dart b/lib/viewevents.dart
index faee89b..746b35c 100644
--- a/lib/viewevents.dart
+++ b/lib/viewevents.dart
@@ -22,6 +22,8 @@ class _ViewEvents extends State<ViewEvents> {
   void initState() {
     _sync_status = _events.getPendingEventCount().toString() + ' event(s) pending';
     super.initState();
+
+    //TODO: Query all events from database everytime this widget is opened. Remove local event storage instance!
   }
 
   Future<void> syncEvents() async {
@@ -40,7 +42,7 @@ class _ViewEvents extends State<ViewEvents> {
           debugPrint('Number of Pending Events: ' + syncCounter.toString());
           var index = 0;
           for (var event in _events.events) {
-            if (event.status == 'PENDING') {
+            if (event.status == 'PENDING') {  //TODO: only query events which are 'PENDING' from database.
               debugPrint('Idx: ' + index.toString() + ' ' +
                   event.toSensorJson().toString());
               index++;
@@ -49,7 +51,7 @@ class _ViewEvents extends State<ViewEvents> {
                 syncCounter--;
                 debugPrint(
                     'put success, remaining events: ' + syncCounter.toString());
-                event.status = 'EXPORTED'; //Update event export only once
+                event.status = 'EXPORTED'; //Update event export only once    //TODO: move to database and update event based in primary row id.
                 setState(() {});
               } else {
                 throw Exception('Sync for ' + event.urn + 'failed');
-- 
GitLab