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