Commit afd2e92

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-10-03 22:09:46
save IntervallStorage in database
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent cd77c96
Changed files (2)
lib
lib/model/storage/db/config_dao.dart
@@ -3,6 +3,7 @@ import 'package:blood_pressure_app/model/storage/db/config_db.dart';
 import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
 import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
 import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
+import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:sqflite/sqflite.dart';
 
@@ -173,6 +174,43 @@ class ConfigDao {
     return exportSettings;
   }
 
+  Future<IntervallStorage> loadIntervallStorage(int profileID, int storageID) async {
+    final dbEntry = await _configDB.database.query(
+        ConfigDB.selectedIntervallStorageTable,
+        columns: ['stepSize', 'start', 'end'],
+        where: 'profile_id = ? AND storage_id = ?',
+        whereArgs: [profileID, storageID]
+    );
+    late final IntervallStorage intervallStorage;
+    if (dbEntry.isEmpty) {
+      intervallStorage = IntervallStorage();
+    } else {
+      assert(dbEntry.length == 1, 'Keys should ensure only one entry is possible.');
+      intervallStorage = IntervallStorage.fromMap(dbEntry.first);
+    }
+
+    intervallStorage.addListener(() {
+      _updateIntervallStorage(profileID, storageID, intervallStorage);
+    });
+    return intervallStorage;
+  }
+
+  /// Update specific [IntervallStorage] for a profile in the database.
+  ///
+  /// Adds an entry if necessary.
+  Future<void> _updateIntervallStorage(int profileID, int storageID, IntervallStorage intervallStorage) async {
+    final Map<String, dynamic> columnValueMap = {
+      'profile_id': profileID,
+      'storage_id': storageID,
+    };
+    columnValueMap.addAll(intervallStorage.toMap());
+    await _configDB.database.insert(
+        ConfigDB.selectedIntervallStorageTable,
+        columnValueMap,
+        conflictAlgorithm: ConflictAlgorithm.replace
+    );
+  }
+
   /// Update [PdfExportSettings] for a profile in the database.
   ///
   /// Adds an entry if necessary.
lib/model/storage/db/config_db.dart
@@ -60,6 +60,22 @@ class ConfigDB {
   static const String _exportPdfSettingsTableCreationString =
       'CREATE TABLE exportPdfSettings(profile_id: INTEGER PRIMARY KEY, json: STRING)';
 
+  /// Name of the table for storing time intervals to display.
+  ///
+  /// It is used to store json representations of [IntervallStorage] objects. Data is saved in as fields, to save space
+  /// on the disk and because no changes in the data format are expected. The field names are made to match the variable
+  /// names in the class.
+  ///
+  /// Note that this table has 2 keys: profile_key to support multiple profiles and storage_id to support saving
+  /// multiple entries per profile (e.g. export screen and main page).
+  ///
+  /// Format: `CREATE TABLE selectedIntervallStorage(profile_id: INTEGER, storage_id: INTEGER, stepSize: INTEGER,`
+  /// ` start: INTEGER, end: INTEGER, PRIMARY KEY(profile_id, storage_id))`
+  static const String selectedIntervallStorageTable = 'selectedIntervallStorage';
+  static const String _selectedIntervallStorageCreationString = 'CREATE TABLE selectedIntervallStorage(profile_id: '
+      'INTEGER, storage_id: INTEGER, stepSize: INTEGER, start: INTEGER, end: INTEGER, '
+      'PRIMARY KEY(profile_id, storage_id))';
+
   /// Name of the exportStrings table. It is used to store formats used in the [ExportConfigurationModel].
   ///
   /// Format:
@@ -92,6 +108,7 @@ class ConfigDB {
     db.execute(_exportSettingsTableCreationString);
     db.execute(_exportCsvSettingsTableCreationString);
     db.execute(_exportPdfSettingsTableCreationString);
+    db.execute(_selectedIntervallStorageCreationString);
   }
 
   FutureOr<void> _onDBUpgrade(Database db, int oldVersion, int newVersion) async {
@@ -102,6 +119,7 @@ class ConfigDB {
       db.execute(_exportSettingsTableCreationString);
       db.execute(_exportCsvSettingsTableCreationString);
       db.execute(_exportPdfSettingsTableCreationString);
+      db.execute(_selectedIntervallStorageCreationString);
       db.database.setVersion(2);
     } else {
       assert(false, 'Unexpected version upgrade from $oldVersion to $newVersion.');