Commit 2785e67

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-06-13 16:03:19
remove all app usages of old record and model
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 6eef81d
app/lib/components/dialoges/add_export_column_dialoge.dart
@@ -1,12 +1,12 @@
 import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
 import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:blood_pressure_app/model/export_import/record_formatter.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:blood_pressure_app/screens/subsettings/export_import/export_field_format_documentation_screen.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
 
 /// Dialoge widget for creating and editing a [UserColumn].
@@ -162,13 +162,15 @@ class _AddExportColumnDialogeState extends State<AddExportColumnDialoge>
                 ),
                 child: (){
                     final record = BloodPressureRecord(
-                      DateTime.now(),
-                      123, 78, 65,
-                      'test note',
+                      time: DateTime.now(),
+                      sys: widget.settings.preferredPressureUnit.wrap(123),
+                      dia: widget.settings.preferredPressureUnit.wrap(78),
+                      pul: 65,
+                      // FIXME 'test note',
                     );
                     final formatter = (type == _FormatterType.record)
-                        ? ScriptedFormatter(recordPattern ?? '')
-                        : ScriptedTimeFormatter(timePattern ?? '');
+                      ? ScriptedFormatter(recordPattern ?? '')
+                      : ScriptedTimeFormatter(timePattern ?? '');
                     final text = formatter.encode(record);
                     final decoded = formatter.decode(text);
                     return Column(
@@ -179,7 +181,7 @@ class _AddExportColumnDialogeState extends State<AddExportColumnDialoge>
                             settings: widget.settings,
                           ) else Text(
                             DateFormat('MMM d, y - h:m.s')
-                                .format(record.creationTime),
+                              .format(record.time),
                         ),
                         const SizedBox(height: 8,),
                         const Icon(Icons.arrow_downward),
app/lib/components/dialoges/add_measurement_dialoge.dart
@@ -4,14 +4,15 @@ import 'dart:math';
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
 import 'package:blood_pressure_app/components/date_time_picker.dart';
 import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
-import 'package:blood_pressure_app/components/settings/settings_widgets.dart';
 import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
+import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
 import 'package:blood_pressure_app/model/storage/storage.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
+import 'package:provider/provider.dart';
 
 /// Input mask for entering measurements.
 class AddEntryDialoge extends StatefulWidget {
@@ -96,10 +97,10 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
   @override
   void initState() {
     super.initState();
-    time = widget.initialRecord?.creationTime ?? DateTime.now();
-    needlePin = widget.initialRecord?.needlePin;
+    time = widget.initialRecord?.time ?? DateTime.now();
+    // needlePin = widget.initialRecord?.needlePin; TODO
     sysController = TextEditingController(
-      text: (widget.initialRecord?.systolic ?? '').toString(),
+      text: (widget.initialRecord?.sys ?? '').toString(),
     );
     if (widget.initialRecord != null) {
       _measurementFormActive = true;
@@ -230,8 +231,14 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
           recordFormKey.currentState?.save();
           if (systolic != null || diastolic != null || pulse != null
               || (notes ?? '').isNotEmpty || needlePin != null) {
-            record = BloodPressureRecord(time, systolic, diastolic, pulse,
-              notes ?? '', needlePin: needlePin,);
+            final pressureUnit = context.read<Settings>().preferredPressureUnit;
+            // TODO: notes, needle pin
+            record = BloodPressureRecord(
+              time: time,
+              sys: systolic == null ? null : pressureUnit.wrap(systolic!),
+              dia: diastolic == null ? null : pressureUnit.wrap(diastolic!),
+              pul: pulse,
+            );
           }
         }
 
@@ -285,7 +292,11 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
                       const SizedBox(width: 16,),
                       _buildValueInput(localizations,
                         labelText: localizations.diaLong,
-                        initialValue: widget.initialRecord?.diastolic,
+                        // TODO: stop duplicating code like this
+                        initialValue: switch(widget.settings.preferredPressureUnit) {
+                          PressureUnit.mmHg => widget.initialRecord?.dia?.mmHg,
+                          PressureUnit.kPa => widget.initialRecord?.dia?.kPa.round(),
+                        },
                         onSaved: (value) =>
                             setState(() => diastolic = int.tryParse(value ?? '')),
                         focusNode: diaFocusNode,
@@ -302,14 +313,14 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
                       const SizedBox(width: 16,),
                       _buildValueInput(localizations,
                         labelText: localizations.pulLong,
-                        initialValue: widget.initialRecord?.pulse,
+                        initialValue: widget.initialRecord?.pul,
                         focusNode: pulFocusNode,
                         onSaved: (value) =>
                             setState(() => pulse = int.tryParse(value ?? '')),
                       ),
                     ],
                   ),
-                  Padding(
+                  /*Padding( FIXME
                     padding: const EdgeInsets.symmetric(vertical: 16),
                     child: TextFormField(
                       initialValue: widget.initialRecord?.notes,
@@ -343,7 +354,7 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
                     },
                     initialColor: needlePin?.color ?? Colors.transparent,
                     shape: _buildShapeBorder(needlePin?.color),
-                  ),
+                  ),*/
                 ],
               ),
             ),
app/lib/components/dialoges/import_preview_dialoge.dart
@@ -3,13 +3,13 @@ import 'dart:math';
 
 import 'package:blood_pressure_app/components/custom_banner.dart';
 import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
 import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// A preview that allows customizing columns used for csv data import.
 ///
app/lib/components/measurement_list/measurement_list.dart
@@ -4,7 +4,7 @@ import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:health_data_store/health_data_store.dart' show BloodPressureRecord, MedicineIntake, MedicineIntakeRepository;
+import 'package:health_data_store/health_data_store.dart';
 
 /// List that renders measurements and medicine intakes.
 ///
@@ -35,9 +35,9 @@ class MeasurementList extends StatelessWidget {
     entries.addAll(records);
     entries.addAll(intakes);
     entries.sort((e1, e2) {
-      if (e2 is BloodPressureRecord && e1 is BloodPressureRecord) return e2.creationTime.compareTo(e1.creationTime);
-      if (e2 is BloodPressureRecord && e1 is MedicineIntake) return e2.creationTime.compareTo(e1.time);
-      if (e2 is MedicineIntake && e1 is BloodPressureRecord) return e2.time.compareTo(e1.creationTime);
+      if (e2 is BloodPressureRecord && e1 is BloodPressureRecord) return e2.time.compareTo(e1.time);
+      if (e2 is BloodPressureRecord && e1 is MedicineIntake) return e2.time.compareTo(e1.time);
+      if (e2 is MedicineIntake && e1 is BloodPressureRecord) return e2.time.compareTo(e1.time);
       if (e2 is MedicineIntake && e1 is MedicineIntake) return e2.time.compareTo(e1.time);
       assert(false);
       return 0;
app/lib/components/measurement_list/measurement_list_entry.dart
@@ -1,18 +1,20 @@
 import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
+import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
 import 'package:blood_pressure_app/model/storage/storage.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:health_data_store/health_data_store.dart' hide BloodPressureRecord;
+import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
 import 'package:provider/provider.dart';
 
 /// Display of a blood pressure measurement data.
 class MeasurementListRow extends StatelessWidget {
   /// Create a display of a measurements.
-  const MeasurementListRow({super.key, required this.record, required this.settings});
+  const MeasurementListRow({super.key,
+    required this.record,
+    required this.settings,
+  });
 
   /// The measurement to display.
   final BloodPressureRecord record;
@@ -28,18 +30,18 @@ class MeasurementListRow extends StatelessWidget {
       // Leading color possible
       title: _buildRow(formatter),
       childrenPadding: const EdgeInsets.only(bottom: 10),
-      backgroundColor: record.needlePin?.color.withAlpha(30),
-      collapsedShape: record.needlePin != null ? Border(left: BorderSide(color: record.needlePin!.color, width: 8)) : null,
+      // backgroundColor: record.needlePin?.color.withAlpha(30), FIXME
+      // collapsedShape: record.needlePin != null ? Border(left: BorderSide(color: record.needlePin!.color, width: 8)) : null,
       children: [
         ListTile(
-          subtitle: Text(formatter.format(record.creationTime)),
+          subtitle: Text(formatter.format(record.time)),
           title: Text(localizations.timestamp),
           trailing: Row(
             mainAxisSize: MainAxisSize.min,
             children: [
               IconButton(
                 onPressed: () async {
-                  final model = Provider.of<BloodPressureModel>(context, listen: false);
+                  final model = RepositoryProvider.of<BloodPressureRepository>(context);
                   final entry = await showAddEntryDialoge(context,
                     Provider.of<Settings>(context, listen: false),
                     RepositoryProvider.of<MedicineRepository>(context),
@@ -47,9 +49,10 @@ class MeasurementListRow extends StatelessWidget {
                   );
                   if (entry?.$1 != null) {
                     if (context.mounted) {
-                      model.addAndExport(context, entry!.$1!);
+                      // model.addAndExport(context, entry!.$1!); FIXME
+                      await model.add(entry!.$1!);
                     } else {
-                      model.add(entry!.$1!);
+                      await model.add(entry!.$1!);
                     }
                   }
                   assert(entry?.$2 == null);
@@ -65,37 +68,41 @@ class MeasurementListRow extends StatelessWidget {
             ],
           ),
         ),
-        if (record.notes.isNotEmpty)
+        /*if (record.notes.isNotEmpty) FIXME
           ListTile(
             title: Text(localizations.note),
             subtitle: Text(record.notes),
-          ),
+          ),*/
       ],
     );
   }
 
   Row _buildRow(DateFormat formatter) {
-    String formatNum(int? num) => (num ?? '-').toString();
+    String formatNum(num? num) => (num ?? '-').toString();
+    String formatPressure(Pressure? num) => switch(settings.preferredPressureUnit) {
+      PressureUnit.mmHg => formatNum(num?.mmHg),
+      PressureUnit.kPa => formatNum(num?.kPa),
+    };
     return Row(
       children: [
         Expanded(
           flex: 3,
-          child: Text(formatNum(record.systolic)),
+          child: Text(formatPressure(record.sys)),
         ),
         Expanded(
           flex: 3,
-          child: Text(formatNum(record.diastolic)),
+          child: Text(formatPressure(record.dia)),
         ),
         Expanded(
           flex: 3,
-          child: Text(formatNum(record.pulse)),
+          child: Text(formatNum(record.pul)),
         ),
       ],
     );
   }
 
   void _deleteEntry(Settings settings, BuildContext context, AppLocalizations localizations) async {
-    final model = Provider.of<BloodPressureModel>(context, listen: false);
+    final model = RepositoryProvider.of<BloodPressureRepository>(context);
     final messanger = ScaffoldMessenger.of(context);
     bool confirmedDeletion = true;
     if (settings.confirmDeletion) {
@@ -103,7 +110,7 @@ class MeasurementListRow extends StatelessWidget {
     }
 
     if (confirmedDeletion) { // TODO: move out of model
-      model.delete(record.creationTime);
+      await model.remove(record);
       messanger.removeCurrentSnackBar();
       messanger.showSnackBar(SnackBar(
         duration: const Duration(seconds: 5),
app/lib/components/statistics/blood_pressure_distribution.dart
@@ -1,9 +1,9 @@
 import 'package:blood_pressure_app/components/statistics/value_distribution.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:collection/collection.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Viewer for [ValueDistribution]s from [BloodPressureRecord]s.
 ///
@@ -79,19 +79,20 @@ class _BloodPressureDistributionState extends State<BloodPressureDistribution>
           child: TabBarView(
             controller: _controller,
             children: [
+              // Preferred pressure unit can be ignored as values are relative.
               ValueDistribution(
                 key: const Key('sys-dist'),
-                values: widget.records.map((e) => e.systolic).whereNotNull(),
+                values: widget.records.map((e) => e.sys?.mmHg).whereNotNull(),
                 color: widget.settings.sysColor,
               ),
               ValueDistribution(
                 key: const Key('dia-dist'),
-                values: widget.records.map((e) => e.diastolic).whereNotNull(),
+                values: widget.records.map((e) => e.dia?.mmHg).whereNotNull(),
                 color: widget.settings.diaColor,
               ),
               ValueDistribution(
                 key: const Key('pul-dist'),
-                values: widget.records.map((e) => e.pulse).whereNotNull(),
+                values: widget.records.map((e) => e.pul).whereNotNull(),
                 color: widget.settings.pulColor,
               ),
             ],
app/lib/components/repository_builder.dart
@@ -1,5 +1,4 @@
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
-import 'package:blood_pressure_app/model/datarange_extension.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
@@ -40,7 +39,7 @@ class _RepositoryBuilderState<T, R extends Repository<T>> extends State<Reposito
       return StreamBuilder(
         stream: _repo.subscribe(),
         builder: (context, _) => ConsistentFutureBuilder(
-          future: _repo.get(range.dateRange),
+          future: _repo.get(range),
           onData: widget.onData,
         ),
       );
app/lib/model/export_import/column.dart
@@ -1,12 +1,10 @@
-import 'dart:convert';
-
-import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
 import 'package:blood_pressure_app/model/export_import/record_formatter.dart';
-import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
+
+// TODO: respect preferred Pressure unit
 
 /// Converters for [BloodPressureRecord] attributes.
 class NativeColumn extends ExportColumn {
@@ -20,14 +18,14 @@ class NativeColumn extends ExportColumn {
     systolic,
     diastolic,
     pulse,
-    notes,
+    /*notes, FIXME
     color,
-    needlePin,
+    needlePin,*/
   ];
   static final NativeColumn timestampUnixMs = NativeColumn._create(
       'timestampUnixMs',
       RowDataFieldType.timestamp,
-          (record) => record.creationTime.millisecondsSinceEpoch.toString(),
+          (record) => record.time.millisecondsSinceEpoch.toString(),
           (pattern) {
         final value = int.tryParse(pattern);
         return (value == null) ? null : DateTime.fromMillisecondsSinceEpoch(value);
@@ -36,21 +34,22 @@ class NativeColumn extends ExportColumn {
     static final NativeColumn systolic = NativeColumn._create(
       'systolic',
       RowDataFieldType.sys,
-      (record) => record.systolic.toString(),
+      (record) => (record.sys?.mmHg).toString(),
       int.tryParse,
     );
     static final NativeColumn diastolic = NativeColumn._create(
       'diastolic',
       RowDataFieldType.dia,
-      (record) => record.diastolic.toString(),
+      (record) => (record.dia?.mmHg).toString(),
       int.tryParse,
     );
     static final NativeColumn pulse = NativeColumn._create(
       'pulse',
       RowDataFieldType.pul,
-      (record) => record.pulse.toString(),
+      (record) => record.pul.toString(),
       int.tryParse,
     );
+    /*
     static final NativeColumn notes = NativeColumn._create(
       'notes',
       RowDataFieldType.notes,
@@ -81,7 +80,7 @@ class NativeColumn extends ExportColumn {
         }
       }
     );
-
+  */
   
   final String _csvTitle;
   final RowDataFieldType _restoreableType;
app/lib/model/export_import/csv_converter.dart
@@ -1,6 +1,5 @@
 
 import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart' show RowDataFieldType;
 import 'package:blood_pressure_app/model/export_import/record_parsing_result.dart';
@@ -8,6 +7,7 @@ import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
 import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
 import 'package:collection/collection.dart';
 import 'package:csv/csv.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Utility class to convert between csv strings and [BloodPressureRecord]s.
 class CsvConverter {
@@ -142,7 +142,12 @@ class CsvConverter {
       final MeasurementNeedlePin? needlePin = recordPieces.firstWhereOrNull(
             (piece) => piece.$1 == RowDataFieldType.needlePin,)?.$2;
 
-      records.add(BloodPressureRecord(timestamp, sys, dia, pul, note, needlePin: needlePin));
+      records.add(BloodPressureRecord(
+        time: timestamp,
+        sys: sys?.asMMHg,
+        dia: dia?.asMMHg,
+        pul: pul,
+        /*FIXME: note, needlePin: needlePin*/));
       currentLineNumber++;
     }
 
@@ -150,3 +155,8 @@ class CsvConverter {
     return RecordParsingResult.ok(records);
   }
 }
+
+extension _AsMMHg on int {
+  /// Interprets the value as a Pressure in mmHg.
+  Pressure get asMMHg => Pressure.mmHg(this);
+}
app/lib/model/export_import/export_configuration.dart
@@ -91,8 +91,8 @@ class ActiveExportColumnConfiguration extends ChangeNotifier {
         NativeColumn.systolic,
         NativeColumn.diastolic,
         NativeColumn.pulse,
-        NativeColumn.notes,
-        NativeColumn.needlePin,
+        /*NativeColumn.notes, FIXME
+        NativeColumn.needlePin,*/
       ],
       ExportImportPreset.myHeart => [
         BuildInColumn.mhDate,
app/lib/model/export_import/pdf_converter.dart
@@ -2,12 +2,12 @@ import 'dart:math';
 import 'dart:typed_data';
 import 'dart:ui';
 
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
 import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
 import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
 import 'package:pdf/pdf.dart';
 import 'package:pdf/widgets.dart' as pw;
app/lib/model/export_import/record_formatter.dart
@@ -1,10 +1,10 @@
 import 'dart:convert';
 
 import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
 import 'package:flutter/material.dart';
 import 'package:function_tree/function_tree.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
 
 /// Class to serialize and deserialize [BloodPressureRecord] values.
@@ -75,12 +75,12 @@ class ScriptedFormatter implements Formatter {
     var fieldContents = pattern;
 
     // variables
-    fieldContents = fieldContents.replaceAll(r'$TIMESTAMP', record.creationTime.millisecondsSinceEpoch.toString());
-    fieldContents = fieldContents.replaceAll(r'$SYS', record.systolic.toString());
-    fieldContents = fieldContents.replaceAll(r'$DIA', record.diastolic.toString());
-    fieldContents = fieldContents.replaceAll(r'$PUL', record.pulse.toString());
-    fieldContents = fieldContents.replaceAll(r'$NOTE', record.notes);
-    fieldContents = fieldContents.replaceAll(r'$COLOR', jsonEncode(record.needlePin?.toMap()));
+    fieldContents = fieldContents.replaceAll(r'$TIMESTAMP', record.time.millisecondsSinceEpoch.toString());
+    fieldContents = fieldContents.replaceAll(r'$SYS', (record.sys?.mmHg).toString());
+    fieldContents = fieldContents.replaceAll(r'$DIA', (record.dia?.mmHg).toString());
+    fieldContents = fieldContents.replaceAll(r'$PUL', record.pul.toString());
+    /*fieldContents = fieldContents.replaceAll(r'$NOTE', record.notes); FIXME
+    fieldContents = fieldContents.replaceAll(r'$COLOR', jsonEncode(record.needlePin?.toMap()));*/
 
     // math
     fieldContents = fieldContents.replaceAllMapped(RegExp(r'\{\{([^}]*)}}'), (m) {
@@ -193,7 +193,7 @@ class ScriptedTimeFormatter implements Formatter {
   }
 
   @override
-  String encode(BloodPressureRecord record) => _timeFormatter.format(record.creationTime);
+  String encode(BloodPressureRecord record) => _timeFormatter.format(record.time);
 
   @override
   String? get formatPattern => _timeFormatter.pattern;
app/lib/model/export_import/record_parsing_result.dart
@@ -1,6 +1,7 @@
 
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
+
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Indicate a possible error during record parsing.
 class RecordParsingResult {
app/lib/model/storage/convert_util.dart
@@ -1,5 +1,6 @@
 
 import 'package:flutter/material.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Utility class for converting dynamic values to concrete data types.
 ///
@@ -66,13 +67,13 @@ class ConvertUtil {
     return null;
   }
 
-  static DateTimeRange? parseRange(start, end) {
+  static DateRange? parseRange(start, end) {
     final startTimestamp = parseInt(start);
     final endTimestamp = parseInt(end);
     if (startTimestamp == null || endTimestamp == null) return null;
-    return DateTimeRange(
-        start: DateTime.fromMillisecondsSinceEpoch(startTimestamp),
-        end: DateTime.fromMillisecondsSinceEpoch(endTimestamp),
+    return DateRange(
+      start: DateTime.fromMillisecondsSinceEpoch(startTimestamp),
+      end: DateTime.fromMillisecondsSinceEpoch(endTimestamp),
     );
   }
 
app/lib/model/storage/intervall_store.dart
@@ -4,6 +4,7 @@ import 'package:blood_pressure_app/model/storage/convert_util.dart';
 import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Class for storing the current interval, as it is needed in start page, statistics and export.
 class IntervallStorage extends ChangeNotifier {
@@ -23,14 +24,14 @@ class IntervallStorage extends ChangeNotifier {
   }
 
   /// Create a storage to interact with a display intervall.
-  IntervallStorage({TimeStep? stepSize, DateTimeRange? range}) :
+  IntervallStorage({TimeStep? stepSize, DateRange? range}) :
     _stepSize = stepSize ?? TimeStep.last7Days {
     _currentRange = range ?? _getMostRecentDisplayIntervall();
   }
 
   TimeStep _stepSize;
 
-  late DateTimeRange _currentRange;
+  late DateRange _currentRange;
 
   /// Serialize the object to a restoreable map.
   Map<String, dynamic> toMap() => <String, dynamic>{
@@ -51,9 +52,9 @@ class IntervallStorage extends ChangeNotifier {
     setToMostRecentIntervall();
   }
 
-  DateTimeRange get currentRange => _currentRange;
+  DateRange get currentRange => _currentRange;
 
-  set currentRange(DateTimeRange value) {
+  set currentRange(DateRange value) {
     _currentRange = value;
     notifyListeners();
   }
@@ -69,47 +70,47 @@ class IntervallStorage extends ChangeNotifier {
     final oldEnd = currentRange.end;
     switch (stepSize) {
       case TimeStep.day:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
           start: oldStart.add(Duration(days: directionalStep)),
           end: oldEnd.add(Duration(days: directionalStep)),
         );
         break;
       case TimeStep.week:
       case TimeStep.last7Days:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
           start: oldStart.add(Duration(days: directionalStep * 7)),
           end: oldEnd.add(Duration(days: directionalStep * 7)),
         );
         break;
       case TimeStep.month:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
           // No fitting Duration: wraps correctly according to doc
           start: oldStart.copyWith(month: oldStart.month + directionalStep),
           end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
         );
         break;
       case TimeStep.year:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
           // No fitting Duration: wraps correctly according to doc
           start: oldStart.copyWith(year: oldStart.year + directionalStep),
           end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
         );
         break;
       case TimeStep.lifetime:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
             start: DateTime.fromMillisecondsSinceEpoch(1),
             end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
         );
         break;
       case TimeStep.last30Days:
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
             start: oldStart.add(Duration(days: directionalStep * 30)),
             end: oldEnd.add(Duration(days:  directionalStep * 30)),
         );
         break;
       case TimeStep.custom:
         final step = oldEnd.difference(oldStart) * directionalStep;
-        currentRange = DateTimeRange(
+        currentRange = DateRange(
             start: oldStart.add(step),
             end: oldEnd.add(step),
         );
@@ -117,35 +118,35 @@ class IntervallStorage extends ChangeNotifier {
     }
   }
 
-  DateTimeRange _getMostRecentDisplayIntervall() {
+  DateRange _getMostRecentDisplayIntervall() {
     final now = DateTime.now();
     switch (stepSize) {
       case TimeStep.day:
         final start = DateTime(now.year, now.month, now.day);
-        return DateTimeRange(start: start, end: start.copyWith(day: now.day + 1));
+        return DateRange(start: start, end: start.copyWith(day: now.day + 1));
       case TimeStep.week:
         final start = DateTime(now.year, now.month, now.day - (now.weekday - 1)); // monday
-        return DateTimeRange(start: start, end: start.copyWith(day: start.day + DateTime.sunday)); // end of sunday
+        return DateRange(start: start, end: start.copyWith(day: start.day + DateTime.sunday)); // end of sunday
       case TimeStep.month:
         final start = DateTime(now.year, now.month);
-        return DateTimeRange(start: start, end: start.copyWith(month: now.month + 1));
+        return DateRange(start: start, end: start.copyWith(month: now.month + 1));
       case TimeStep.year:
         final start = DateTime(now.year);
-        return DateTimeRange(start: start, end: start.copyWith(year: now.year + 1));
+        return DateRange(start: start, end: start.copyWith(year: now.year + 1));
       case TimeStep.lifetime:
         final start = DateTime.fromMillisecondsSinceEpoch(1);
         final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return DateTimeRange(start: start, end: endOfToday);
+        return DateRange(start: start, end: endOfToday);
       case TimeStep.last7Days:
         final start = now.subtract(const Duration(days: 7));
         final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return DateTimeRange(start: start, end: endOfToday);
+        return DateRange(start: start, end: endOfToday);
       case TimeStep.last30Days:
         final start = now.subtract(const Duration(days: 30));
         final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
-        return DateTimeRange(start: start, end: endOfToday);
+        return DateRange(start: start, end: endOfToday);
       case TimeStep.custom:
-        return DateTimeRange(
+        return DateRange(
           start: now.subtract(currentRange.duration),
           end: now,
         );
app/lib/model/horizontal_graph_line.dart
@@ -1,5 +1,5 @@
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:flutter/material.dart';
+import 'package:health_data_store/health_data_store.dart';
 
 /// Information about a straight horizontal line through the graph.
 ///
app/lib/screens/elements/display_interval_picker.dart
@@ -1,3 +1,4 @@
+import 'package:blood_pressure_app/model/datarange_extension.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -71,12 +72,13 @@ class IntervalPicker extends StatelessWidget {
                 onChanged: (TimeStep? value) async {
                   if (value == TimeStep.custom) {
                     final res = await showDateRangePicker(
-                        context: context,
-                        firstDate: DateTime.fromMillisecondsSinceEpoch(1),
-                        lastDate: DateTime.now(),);
+                      context: context,
+                      firstDate: DateTime.fromMillisecondsSinceEpoch(1),
+                      lastDate: DateTime.now(),
+                    );
                     if (res != null) {
                       intervall.changeStepSize(value!);
-                      intervall.currentRange = res;
+                      intervall.currentRange = res.dateRange;
                     }
                   } else if (value != null) {
                     intervall.changeStepSize(value);
app/lib/screens/elements/legacy_measurement_list.dart
@@ -2,7 +2,6 @@ import 'dart:async';
 import 'dart:collection';
 
 import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:blood_pressure_app/screens/elements/blood_pressure_builder.dart';
@@ -86,7 +85,6 @@ class LegacyMeasurementsList extends StatelessWidget {
                             confirmDismiss: (direction) async {
                               final repo = RepositoryProvider.of<BloodPressureRepository>(context);
                               if (direction == DismissDirection.startToEnd) { // edit
-                                final model = Provider.of<BloodPressureModel>(context, listen: false);
                                 final entry = await showAddEntryDialoge(context,
                                   Provider.of<Settings>(context, listen: false),
                                   RepositoryProvider.of<MedicineRepository>(context),
@@ -94,11 +92,11 @@ class LegacyMeasurementsList extends StatelessWidget {
                                 );
                                 if (entry?.$1 != null) {
                                   if (context.mounted) {
-                                    // TODO: reimplement
+                                    // FIXME
                                     // repo.addAndExport(context, entry!.$1!);
                                     throw UnimplementedError('addAndExport not supported');
                                   } else {
-                                    unawaited(repo.add(entry!.$1!));
+                                    await repo.add(entry!.$1!);
                                   }
                                 }
                                 assert(entry?.$2 == null);
@@ -139,7 +137,7 @@ class LegacyMeasurementsList extends StatelessWidget {
                                     action: SnackBarAction(
                                       label: AppLocalizations.of(context)!.btnUndo,
                                       onPressed: () async {
-                                        // TODO: reimplement
+                                        // FIXME
                                         /*
                                         model.addAndExport(context, BloodPressureRecord(
                                             data[index].creationTime,
app/lib/screens/elements/measurement_graph.dart
@@ -15,8 +15,8 @@ import 'package:intl/intl.dart';
 import 'package:provider/provider.dart';
 
 class _LineChart extends StatefulWidget {
-
   const _LineChart({this.height = 200});
+
   final double height;
 
   @override
@@ -26,86 +26,86 @@ class _LineChart extends StatefulWidget {
 class _LineChartState extends State<_LineChart> {
   @override
   Widget build(BuildContext context) => SizedBox(
-        height: widget.height,
-        child: RepositoryBuilder<MedicineIntake, MedicineIntakeRepository>(
-          rangeType: IntervallStoreManagerLocation.mainPage,
-          onData: (context, List<dynamic> intakesData) => Consumer<Settings>(
-          builder: (context, settings, child) => BloodPressureBuilder(
-              rangeType: IntervallStoreManagerLocation.mainPage,
-              onData: (BuildContext context, UnmodifiableListView<BloodPressureRecord> records) {
-                // TODO: Figure out why type safety isn't possible. (see home_screen for more info)
-                final List<MedicineIntake> intakes = intakesData.cast();
+    height: widget.height,
+    child: RepositoryBuilder<MedicineIntake, MedicineIntakeRepository>(
+      rangeType: IntervallStoreManagerLocation.mainPage,
+      onData: (context, List<dynamic> intakesData) => Consumer<Settings>(
+      builder: (context, settings, child) => BloodPressureBuilder(
+        rangeType: IntervallStoreManagerLocation.mainPage,
+        onData: (BuildContext context, UnmodifiableListView<BloodPressureRecord> records) {
+          // TODO: Figure out why type safety isn't possible. (see home_screen for more info)
+          final List<MedicineIntake> intakes = intakesData.cast();
 
-                final List<BloodPressureRecord> data = records.toList();
-                data.sort((a, b) => a.time.compareTo(b.time));
+          final List<BloodPressureRecord> data = records.toList();
+          data.sort((a, b) => a.time.compareTo(b.time));
 
-                // calculate lines for graph
-                final pulSpots = <FlSpot>[];
-                final diaSpots = <FlSpot>[];
-                final sysSpots = <FlSpot>[];
-                int maxValue = 0;
-                final int minValue = (settings.validateInputs ? 30 : 0);
-                /// Horizontally first value
-                double? graphBegin;
-                /// Horizontally last value
-                double? graphEnd;
-                for (final e in data) {
-                  final x = e.time.millisecondsSinceEpoch.toDouble();
-                  if (e.dia != null) {
-                    diaSpots.add(FlSpot(x, e.dia!.mmHg.toDouble()));
-                    maxValue = max(maxValue, e.dia!.mmHg);
-                  }
-                  if (e.sys != null) {
-                    sysSpots.add(FlSpot(x, e.sys!.mmHg.toDouble()));
-                    maxValue = max(maxValue, e.sys!.mmHg);
-                  }
-                  if (e.pul != null) {
-                    pulSpots.add(FlSpot(x, e.pul!.mmHg.toDouble()));
-                    maxValue = max(maxValue, e.pul!.mmHg);
-                  }
-                  graphBegin ??= x;
-                  graphEnd ??= x;
-                  if (x < graphBegin) graphBegin = x;
-                  if (x > graphEnd) graphEnd = x;
-                }
+          // calculate lines for graph
+          final pulSpots = <FlSpot>[];
+          final diaSpots = <FlSpot>[];
+          final sysSpots = <FlSpot>[];
+          int maxValue = 0;
+          final int minValue = (settings.validateInputs ? 30 : 0);
+          /// Horizontally first value
+          double? graphBegin;
+          /// Horizontally last value
+          double? graphEnd;
+          for (final e in data) {
+            final x = e.time.millisecondsSinceEpoch.toDouble();
+            if (e.dia != null) {
+              diaSpots.add(FlSpot(x, e.dia!.mmHg.toDouble()));
+              maxValue = max(maxValue, e.dia!.mmHg);
+            }
+            if (e.sys != null) {
+              sysSpots.add(FlSpot(x, e.sys!.mmHg.toDouble()));
+              maxValue = max(maxValue, e.sys!.mmHg);
+            }
+            if (e.pul != null) {
+              pulSpots.add(FlSpot(x, e.pul!.toDouble()));
+              maxValue = max(maxValue, e.pul!);
+            }
+            graphBegin ??= x;
+            graphEnd ??= x;
+            if (x < graphBegin) graphBegin = x;
+            if (x > graphEnd) graphEnd = x;
+          }
 
-                if (diaSpots.length < 2 && sysSpots.length < 2 && pulSpots.length < 2 || graphBegin == null || graphEnd == null) {
-                  return Text(AppLocalizations.of(context)!.errNotEnoughDataToGraph);
-                }
+          if (diaSpots.length < 2 && sysSpots.length < 2 && pulSpots.length < 2 || graphBegin == null || graphEnd == null) {
+            return Text(AppLocalizations.of(context)!.errNotEnoughDataToGraph);
+          }
 
-                // Add padding to avoid overflowing vertical lines.
-                final len = graphEnd - graphBegin;
-                graphBegin -= len / 40;
-                graphEnd += len / 40;
+          // Add padding to avoid overflowing vertical lines.
+          final len = graphEnd - graphBegin;
+          graphBegin -= len / 40;
+          graphEnd += len / 40;
 
-                return TweenAnimationBuilder<double>(
-                  duration: Duration(milliseconds: settings.animationSpeed), // interacts with LineChart duration property
-                  tween: Tween<double>(begin: 0, end: settings.graphLineThickness),
-                  builder: (context, animatedThickness, child) => LineChart(
-                      duration: const Duration(milliseconds: 200),
-                      LineChartData(
-                          minY: minValue.toDouble(),
-                          maxY: maxValue + 5,
-                          minX: graphBegin,
-                          maxX: graphEnd,
-                          clipData: const FlClipData.all(),
-                          titlesData: _buildFlTitlesData(settings,
-                              DateTimeRange(start: data.first.time, end: data.last.time),),
-                          lineTouchData: const LineTouchData(
-                              touchTooltipData: LineTouchTooltipData(tooltipMargin: -200, tooltipRoundedRadius: 20),
-                          ),
-                          lineBarsData: buildBars(animatedThickness, settings, sysSpots, diaSpots, pulSpots,
-                              maxValue, minValue, graphBegin, graphEnd, records,
-                              intakes,
-                          ),
-                      ),
-                    ),
-                );
-              },
+          return TweenAnimationBuilder<double>(
+            duration: Duration(milliseconds: settings.animationSpeed), // interacts with LineChart duration property
+            tween: Tween<double>(begin: 0, end: settings.graphLineThickness),
+            builder: (context, animatedThickness, child) => LineChart(
+              duration: const Duration(milliseconds: 200),
+              LineChartData(
+                minY: minValue.toDouble(),
+                maxY: maxValue + 5,
+                minX: graphBegin,
+                maxX: graphEnd,
+                clipData: const FlClipData.all(),
+                titlesData: _buildFlTitlesData(settings,
+                  DateTimeRange(start: data.first.time, end: data.last.time),),
+                lineTouchData: const LineTouchData(
+                  touchTooltipData: LineTouchTooltipData(tooltipMargin: -200, tooltipRoundedRadius: 20),
+                ),
+                lineBarsData: buildBars(animatedThickness, settings, sysSpots, diaSpots, pulSpots,
+                  maxValue, minValue, graphBegin, graphEnd, records,
+                  intakes,
+                ),
+              ),
             ),
-        ),
+          );
+        },
       ),
-    );
+      ),
+    ),
+  );
 
   List<LineChartBarData> buildBars(
       double animatedThickness, 
app/lib/screens/subsettings/export_import/export_button_bar.dart
@@ -1,10 +1,9 @@
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
 
 import 'package:blood_pressure_app/components/dialoges/import_preview_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/csv_converter.dart';
 import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
 import 'package:blood_pressure_app/model/export_import/pdf_converter.dart';
@@ -17,12 +16,16 @@ import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:blood_pressure_app/platform_integration/platform_client.dart';
 import 'package:file_picker/file_picker.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:jsaver/jSaver.dart';
 import 'package:path/path.dart';
 import 'package:provider/provider.dart';
 import 'package:sqflite/sqflite.dart';
 
+// FIXME: import and export all datatypes (intakes, ...)
+
 /// Button row to export and import the current configuration.
 class ExportButtonBar extends StatelessWidget {
   /// Create buttons for im- and exporting measurements.
@@ -84,15 +87,19 @@ class ExportButtonBar extends StatelessWidget {
                       Provider.of<Settings>(context, listen: false).bottomAppBars,
                     );
                     if (importedRecords == null || !context.mounted) return;
-                    final model = Provider.of<BloodPressureModel>(context, listen: false);
-                    await model.addAll(importedRecords, null);
+                    final repo = context.read<BloodPressureRepository>();
+                    await Future.forEach<BloodPressureRecord>(importedRecords, repo.add);
                     messenger.showSnackBar(SnackBar(content: Text(
-                        localizations.importSuccess(importedRecords.length),),),);
+                      localizations.importSuccess(importedRecords.length),),),);
                     break;
                   case 'db':
-                    final model = Provider.of<BloodPressureModel>(context, listen: false);
-                    final importedModel = await BloodPressureModel.create(dbPath: file.path, isFullPath: true);
-                    await model.addAll(await importedModel.all, null);
+                    if (file.path == null) return;
+                    final repo = context.read<BloodPressureRepository>();
+                    final importedDB = await HealthDataStore.load(await openReadOnlyDatabase(file.path!));
+                    await Future.forEach(
+                      await importedDB.bpRepo.get(DateRange.all()),
+                      repo.add,
+                    );
                     break;
                   default:
                     _showError(messenger, localizations.errWrongImportFormat);
@@ -119,7 +126,7 @@ void performExport(BuildContext context, [AppLocalizations? localizations]) asyn
     case ExportFormat.db:
       final path = join(await getDatabasesPath(), 'blood_pressure.db');
 
-      if (context.mounted) _exportFile(context, path, '$filename.db', 'text/sqlite');
+      if (context.mounted) await _exportFile(context, path, '$filename.db', 'text/sqlite');
       break;
     case ExportFormat.csv:
       final csvConverter = CsvConverter(
@@ -128,7 +135,7 @@ void performExport(BuildContext context, [AppLocalizations? localizations]) asyn
       );
       final csvString = csvConverter.create(await _getRecords(context));
       final data = Uint8List.fromList(utf8.encode(csvString));
-      if (context.mounted) _exportData(context, data, '$filename.csv', 'text/csv');
+      if (context.mounted) await _exportData(context, data, '$filename.csv', 'text/csv');
       break;
     case ExportFormat.pdf:
       final pdfConverter = PdfConverter(
@@ -138,15 +145,15 @@ void performExport(BuildContext context, [AppLocalizations? localizations]) asyn
           Provider.of<ExportColumnsManager>(context, listen: false),
       );
       final pdf = await pdfConverter.create(await _getRecords(context));
-      if (context.mounted) _exportData(context, pdf, '$filename.pdf', 'text/pdf');
+      if (context.mounted) await _exportData(context, pdf, '$filename.pdf', 'text/pdf');
   }
 }
 
 /// Get the records that should be exported.
 Future<List<BloodPressureRecord>> _getRecords(BuildContext context) {
   final range = Provider.of<IntervallStoreManager>(context, listen: false).exportPage.currentRange;
-  final model = Provider.of<BloodPressureModel>(context, listen: false);
-  return model.getInTimeRange(range.start, range.end);
+  final model = RepositoryProvider.of<BloodPressureRepository>(context);
+  return model.get(range);
 }
 
 /// Save to default export path or share by providing a path.
@@ -155,7 +162,7 @@ Future<void> _exportFile(BuildContext context, String path, String fullFileName,
   if (settings.defaultExportDir.isEmpty) {
     await PlatformClient.shareFile(path, mimeType, fullFileName);
   } else {
-    JSaver.instance.save(
+    await JSaver.instance.save(
         fromPath: path,
         androidPathOptions: AndroidPathOptions(toDefaultDirectory: true),
     );
app/lib/screens/subsettings/foreign_db_import_screen.dart
@@ -1,14 +1,13 @@
-import 'dart:convert';
-
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
 import 'package:blood_pressure_app/components/dialoges/tree_selection_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
 import 'package:blood_pressure_app/model/storage/convert_util.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:collection/collection.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
+import 'package:provider/provider.dart';
 import 'package:sqflite/sqflite.dart';
 import 'package:sqlparser/sqlparser.dart';
 
@@ -92,29 +91,32 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
                 && madeSelections.every(row.containsKey),);
             final timestamp = ConvertUtil.parseTime(row[timeColumn]);
             if (timestamp == null) throw FormatException('Unable to parse time: ${row[timeColumn]}'); // TODO: error handling
-            var record = BloodPressureRecord(timestamp, null, null, null, '');
+            var record = BloodPressureRecord(time: timestamp);
+            final settings = context.read<Settings>();
             for (final colType in dataColumns) {
               switch (colType.$2) {
                 case RowDataFieldType.timestamp:
                   assert(false, 'Not up for selection');
                 case RowDataFieldType.sys:
+                  final val = ConvertUtil.parseInt(row[colType.$1]);
                   record = record.copyWith(
-                    systolic: ConvertUtil.parseInt(row[colType.$1]),
+                    sys: (val == null) ? null : settings.preferredPressureUnit.wrap(val), // TODO: is this correct?
                   );
                 case RowDataFieldType.dia:
+                  final val = ConvertUtil.parseInt(row[colType.$1]);
                   record = record.copyWith(
-                    diastolic: ConvertUtil.parseInt(row[colType.$1]),
+                    dia: (val == null) ? null : settings.preferredPressureUnit.wrap(val),
                   );
                 case RowDataFieldType.pul:
                   record = record.copyWith(
-                    pulse: ConvertUtil.parseInt(row[colType.$1]),
+                    pul: ConvertUtil.parseInt(row[colType.$1]),
                   );
                 case RowDataFieldType.notes:
-                  record = record.copyWith(
+                  /*re cord = record.copyWith( FIXME
                     notes: ConvertUtil.parseString(row[colType.$1]),
-                  );
+                  );*/
                 case RowDataFieldType.needlePin:
-                  try {
+                  /*try { FIXME
                     final json = jsonDecode(row[colType.$1].toString());
                     if (json is! Map<String, dynamic>) continue;
                     final pin = MeasurementNeedlePin.fromMap(json);
@@ -123,7 +125,7 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
                     );
                   } on FormatException {
                     // Not parsable: silently ignore for now
-                  }
+                  }*/
               }
             }
             measurements.add(record);
app/lib/screens/home_screen.dart
@@ -3,7 +3,6 @@ import 'dart:async';
 import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
 import 'package:blood_pressure_app/components/measurement_list/measurement_list.dart';
 import 'package:blood_pressure_app/components/repository_builder.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:blood_pressure_app/screens/elements/blood_pressure_builder.dart';
@@ -118,7 +117,7 @@ class AppHome extends StatelessWidget {
                       tooltip: localizations.addMeasurement,
                       autofocus: true,
                       onPressed: () async {
-                        final model = Provider.of<BloodPressureModel>(context, listen: false);
+                        final model = Provider.of<BloodPressureRepository>(context, listen: false);
                         final intakes = RepositoryProvider.of<MedicineIntakeRepository>(context);
                         final measurement = await showAddEntryDialoge(context,
                           Provider.of<Settings>(context, listen: false),
@@ -127,13 +126,14 @@ class AppHome extends StatelessWidget {
                         if (measurement == null) return;
                         if (measurement.$1 != null) {
                           if (context.mounted) {
-                            model.addAndExport(context, measurement.$1!);
+                            await model.add(measurement.$1!);
+                            // model.addAndExport(context, measurement.$1!); FIXME
                           } else {
-                            model.add(measurement.$1!);
+                            await model.add(measurement.$1!);
                           }
                         }
                         if (measurement.$2 != null) {
-                          intakes.add(measurement.$2!);
+                          await intakes.add(measurement.$2!);
                         }
                       },
                       child: const Icon(Icons.add,),
app/lib/screens/settings_screen.dart
@@ -4,7 +4,6 @@ import 'package:blood_pressure_app/components/consistent_future_builder.dart';
 import 'package:blood_pressure_app/components/dialoges/enter_timeformat_dialoge.dart';
 import 'package:blood_pressure_app/components/dialoges/input_dialoge.dart';
 import 'package:blood_pressure_app/components/settings/settings_widgets.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
 import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
 import 'package:blood_pressure_app/model/blood_pressure/warn_values.dart';
 import 'package:blood_pressure_app/model/iso_lang_names.dart';
@@ -19,7 +18,9 @@ import 'package:blood_pressure_app/screens/subsettings/version_screen.dart';
 import 'package:blood_pressure_app/screens/subsettings/warn_about_screen.dart';
 import 'package:file_picker/file_picker.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
 import 'package:package_info_plus/package_info_plus.dart';
 import 'package:path/path.dart';
 import 'package:provider/provider.dart';
@@ -296,7 +297,7 @@ class SettingsPage extends StatelessWidget {
                     assert(dbPath != inMemoryDatabasePath);
                     dbPath = join(dbPath, 'config.db');
                     assert(Platform.isAndroid);
-                    PlatformClient.shareFile(dbPath, 'application/vnd.sqlite3');
+                    await PlatformClient.shareFile(dbPath, 'application/vnd.sqlite3');
                   },
                 ),
                 ListTile(
@@ -369,12 +370,12 @@ class SettingsPage extends StatelessWidget {
                       return;
                     }
                     // TODO: Show import preview
-                    final model = Provider.of<BloodPressureModel>(context, listen: false);
-                    await model.addAll(data, context);
+                    final repo = RepositoryProvider.of<BloodPressureRepository>(context);
+                    await Future.forEach(data, repo.add);
                     // TODO: give feedback
 
                   },
-                )
+                ),
               ],
             ),
             TitledColumn(title: Text(localizations.aboutWarnValuesScreen), children: [
app/lib/main.dart
@@ -2,7 +2,6 @@ import 'dart:io';
 
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
 import 'package:blood_pressure_app/model/blood_pressure/medicine/intake_history.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
 import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
 import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
 import 'package:blood_pressure_app/model/storage/db/config_db.dart';
@@ -22,7 +21,6 @@ import 'package:provider/provider.dart';
 import 'package:sqflite/sqflite.dart';
 
 late final ConfigDB _database;
-late final BloodPressureModel _bloodPressureModel;
 
 void main() async {
   runApp(ConsistentFutureBuilder(
@@ -36,9 +34,7 @@ void main() async {
 Future<Widget> _loadApp() async {
   WidgetsFlutterBinding.ensureInitialized();
   // 2 different db files
-  _bloodPressureModel = await BloodPressureModel.create();
-
-  _database = await ConfigDB.open();
+    _database = await ConfigDB.open();
   final configDao = ConfigDao(_database);
 
   final settings = await configDao.loadSettings(0);
@@ -99,7 +95,6 @@ Future<Widget> _loadApp() async {
   // TODO: fix navigation test failures
 
   return MultiProvider(providers: [
-    ChangeNotifierProvider(create: (context) => _bloodPressureModel),
     ChangeNotifierProvider(create: (context) => settings),
     ChangeNotifierProvider(create: (context) => exportSettings),
     ChangeNotifierProvider(create: (context) => csvExportSettings),
@@ -195,5 +190,4 @@ Future<void> closeDatabases() async {
   _isDatabaseClosed = true;
 
   await _database.database.close();
-  await _bloodPressureModel.close();
 }
app/pubspec.lock
@@ -360,10 +360,10 @@ packages:
     dependency: "direct main"
     description:
       name: intl
-      sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
+      sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
       url: "https://pub.dev"
     source: hosted
-    version: "0.18.1"
+    version: "0.19.0"
   js:
     dependency: transitive
     description:
@@ -392,18 +392,18 @@ packages:
     dependency: transitive
     description:
       name: leak_tracker
-      sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
+      sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
       url: "https://pub.dev"
     source: hosted
-    version: "10.0.4"
+    version: "10.0.5"
   leak_tracker_flutter_testing:
     dependency: transitive
     description:
       name: leak_tracker_flutter_testing
-      sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
+      sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.3"
+    version: "3.0.5"
   leak_tracker_testing:
     dependency: transitive
     description:
@@ -448,18 +448,18 @@ packages:
     dependency: transitive
     description:
       name: material_color_utilities
-      sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
+      sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
       url: "https://pub.dev"
     source: hosted
-    version: "0.8.0"
+    version: "0.11.1"
   meta:
     dependency: transitive
     description:
       name: meta
-      sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
+      sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b"
       url: "https://pub.dev"
     source: hosted
-    version: "1.12.0"
+    version: "1.14.0"
   mockito:
     dependency: "direct dev"
     description:
@@ -845,10 +845,10 @@ packages:
     dependency: transitive
     description:
       name: test_api
-      sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
+      sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794"
       url: "https://pub.dev"
     source: hosted
-    version: "0.7.0"
+    version: "0.7.1"
   translations_cleaner:
     dependency: "direct dev"
     description:
@@ -941,10 +941,10 @@ packages:
     dependency: transitive
     description:
       name: vm_service
-      sha256: a2662fb1f114f4296cf3f5a50786a2d888268d7776cf681aa17d660ffa23b246
+      sha256: "7475cb4dd713d57b6f7464c0e13f06da0d535d8b2067e188962a59bac2cf280b"
       url: "https://pub.dev"
     source: hosted
-    version: "14.0.0"
+    version: "14.2.2"
   watcher:
     dependency: transitive
     description:
health_data_store/lib/src/health_data_store.dart
@@ -31,6 +31,7 @@ class HealthDataStore {
   /// returned. This is done to improve performance while interacting with the
   /// database.
   static Future<HealthDataStore> load(Database db) async {
+    // TODO: loading readOnly dbs
     assert(db.isOpen);
     final mngr = await DatabaseManager.load(db);
     unawaited(mngr.performCleanup());