Commit 549f63b
Changed files (3)
lib
lib/model/blood_pressure.dart
@@ -49,11 +49,9 @@ class BloodPressureModel extends ChangeNotifier {
/// Adds a new measurement at the correct chronological position in the List.
Future<void> add(BloodPressureRecord measurement) async {
- assert(_database.isOpen);
-
- var existing = _database.query('bloodPressureModel', where: 'timestamp = ?',
+ final existing = await _database.query('bloodPressureModel', where: 'timestamp = ?',
whereArgs: [measurement.creationTime.millisecondsSinceEpoch]);
- if ((await existing).isNotEmpty) {
+ if (existing.isNotEmpty) {
await _database.update('bloodPressureModel', {
'systolic': measurement.systolic,
'diastolic': measurement.diastolic,
@@ -70,34 +68,27 @@ class BloodPressureModel extends ChangeNotifier {
'notes': measurement.notes
});
}
+ notifyListeners();
+ }
+ Future<void> delete(DateTime timestamp) async {
+ _database.delete('bloodPressureModel', where: 'timestamp = ?', whereArgs: [timestamp.millisecondsSinceEpoch]);
notifyListeners();
}
/// Returns all recordings in saved in a range in ascending order
Future<UnmodifiableListView<BloodPressureRecord>> getInTimeRange(DateTime from, DateTime to) async {
- var dbEntries = await _database.query('bloodPressureModel',
+ final dbEntries = await _database.query('bloodPressureModel',
orderBy: 'timestamp DESC',
where: 'timestamp BETWEEN ? AND ?',
whereArgs: [from.millisecondsSinceEpoch, to.millisecondsSinceEpoch]
); // descending
- // synchronous part
- List<BloodPressureRecord> recordsInRange = [];
- for (var e in dbEntries) {
- recordsInRange.add(BloodPressureRecord(
- DateTime.fromMillisecondsSinceEpoch(e['timestamp']as int),
- e['systolic'] as int,
- e['diastolic'] as int,
- e['pulse'] as int,
- e['notes'].toString())
- );
- }
+ List<BloodPressureRecord> recordsInRange = _convert(dbEntries);
return UnmodifiableListView(recordsInRange);
}
- Future<void> delete(DateTime timestamp) async {
- _database.delete('bloodPressureModel', where: 'timestamp = ?', whereArgs: [timestamp.millisecondsSinceEpoch]);
- notifyListeners();
+ Future<List<Map<String, Object?>>> get bloodPressureModel {
+ return _database.query('bloodPressureModel', columns: ['*']);
}
Future<int> get count async {
@@ -229,6 +220,20 @@ class BloodPressureModel extends ChangeNotifier {
return (v as double?)?.toInt();
}
}
+
+ List<BloodPressureRecord> _convert(List<Map<String, Object?>> dbResult) {
+ List<BloodPressureRecord> records = [];
+ for (var e in dbResult) {
+ records.add(BloodPressureRecord(
+ DateTime.fromMillisecondsSinceEpoch(e['timestamp']as int),
+ e['systolic'] as int,
+ e['diastolic'] as int,
+ e['pulse'] as int,
+ e['notes'].toString())
+ );
+ }
+ return records;
+ }
}
@immutable
lib/model/blood_pressure_analyzer.dart
@@ -1,4 +1,5 @@
import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:collection/collection.dart';
class BloodPressureAnalyser {
final BloodPressureModel _model;
@@ -31,7 +32,7 @@ class BloodPressureAnalyser {
List<List<int>> allPulValuesRelativeToTime = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]];
// sort all data
- final dbRes = await _database.query('bloodPressureModel', columns: ['*']);
+ final dbRes = await _model.bloodPressureModel;
for (var entry in dbRes) {
DateTime ts = DateTime.fromMillisecondsSinceEpoch(entry['timestamp'] as int);
allDiaValuesRelativeToTime[ts.hour].add(entry['diastolic'] as int);
@@ -40,13 +41,13 @@ class BloodPressureAnalyser {
}
for(int i = 0; i < 24; i++) {
if (allDiaValuesRelativeToTime[i].isEmpty) {
- allDiaValuesRelativeToTime[i].add(await avgDia);
+ allDiaValuesRelativeToTime[i].add(await _model.avgDia);
}
if (allSysValuesRelativeToTime[i].isEmpty) {
- allSysValuesRelativeToTime[i].add(await avgSys);
+ allSysValuesRelativeToTime[i].add(await _model.avgSys);
}
if (allPulValuesRelativeToTime[i].isEmpty) {
- allPulValuesRelativeToTime[i].add(await avgPul);
+ allPulValuesRelativeToTime[i].add(await _model.avgPul);
}
}
lib/screens/statistics.dart
@@ -1,4 +1,5 @@
import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
import 'package:blood_pressure_app/model/settings_store.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
@@ -38,7 +39,7 @@ class StatisticsPage extends StatelessWidget {
),
Statistic(
caption: const Text('Measurements per Day'),
- child: futureInt(model.measurementsPerDay)
+ child: futureInt(BloodPressureAnalyser(model).measurementsPerDay)
),
StatisticsRow(
caption2: Text('Diastolic min.',
@@ -66,7 +67,7 @@ class StatisticsPage extends StatelessWidget {
Statistic(
caption: const Text('Time-Resolved Metrics'),
child: FutureBuilder<List<List<int>>>(
- future: model.allAvgsRelativeToDaytime,
+ future: BloodPressureAnalyser(model).allAvgsRelativeToDaytime,
builder: (BuildContext context, AsyncSnapshot<List<
List<int>>> snapshot) {
switch (snapshot.connectionState) {