Commit afd2e92
Changed files (2)
lib
model
storage
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.');