Commit 9b5d3b0

derdilla <derdilla06@gmail.com>
2023-06-22 14:23:38
export as db file
1 parent 0c20a72
Changed files (4)
lib/l10n/app_en.arb
@@ -94,6 +94,7 @@
   "exportCsvHeadlineDesc": "Helps to discriminate types",
   "csv": "CSV",
   "pdf": "PDF",
+  "db": "SQLITE DB",
   "text": "text",
   "other": "other",
   "fieldDelimiter": "field delimiter",
lib/model/export_import.dart
@@ -1,10 +1,13 @@
 
 import 'dart:convert';
+import 'dart:io';
 import 'dart:typed_data';
 
 import 'package:blood_pressure_app/model/pdf_creator.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:csv/csv.dart';
+import 'package:path/path.dart';
+import 'package:sqflite/sqflite.dart';
 
 import 'blood_pressure.dart';
 
@@ -14,59 +17,65 @@ class DataExporter {
   DataExporter(this.settings);
 
   Future<Uint8List> createFile(List<BloodPressureRecord> records) async {
-    if (settings.exportFormat == ExportFormat.csv) {
-      List<String> exportItems;
-      if (settings.exportCustomEntries) {
-        exportItems = settings.exportItems;
-      } else {
-        exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
-      }
+    switch (settings.exportFormat) {
+      case ExportFormat.csv:
+        return createCSVCFile(records);
+      case ExportFormat.pdf:
+        return await PdfCreator().createPdf(records);
+      case ExportFormat.db:
+        return copyDBFile();
+    }
+  }
 
-      var csvHead = '';
-      if (settings.exportCsvHeadline) {
-        for (var i = 0; i<exportItems.length; i++) {
-          csvHead += exportItems[i];
-          if (i<(exportItems.length - 1)) {
-            csvHead += settings.csvFieldDelimiter;
-          }
+  Uint8List createCSVCFile(List<BloodPressureRecord> records) {
+    List<String> exportItems;
+    if (settings.exportCustomEntries) {
+      exportItems = settings.exportItems;
+    } else {
+      exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
+    }
+
+    var csvHead = '';
+    if (settings.exportCsvHeadline) {
+      for (var i = 0; i<exportItems.length; i++) {
+        csvHead += exportItems[i];
+        if (i<(exportItems.length - 1)) {
+          csvHead += settings.csvFieldDelimiter;
         }
-        csvHead += '\r\n';
       }
+      csvHead += '\r\n';
+    }
 
-      List<List<dynamic>> items = [];
-      for (var record in records) {
-        List<dynamic> row = [];
-        for (var attribute in exportItems) {
-          switch (attribute) {
-            case 'timestampUnixMs':
-              row.add(record.creationTime.millisecondsSinceEpoch);
-              break;
-            case 'isoUTCTime':
-              row.add(record.creationTime.toIso8601String());
-              break;
-            case 'systolic':
-              row.add(record.systolic);
-              break;
-            case 'diastolic':
-              row.add(record.diastolic);
-              break;
-            case 'pulse':
-              row.add(record.pulse);
-              break;
-            case 'notes':
-              row.add(record.notes);
-              break;
-          }
+    List<List<dynamic>> items = [];
+    for (var record in records) {
+      List<dynamic> row = [];
+      for (var attribute in exportItems) {
+        switch (attribute) {
+          case 'timestampUnixMs':
+            row.add(record.creationTime.millisecondsSinceEpoch);
+            break;
+          case 'isoUTCTime':
+            row.add(record.creationTime.toIso8601String());
+            break;
+          case 'systolic':
+            row.add(record.systolic);
+            break;
+          case 'diastolic':
+            row.add(record.diastolic);
+            break;
+          case 'pulse':
+            row.add(record.pulse);
+            break;
+          case 'notes':
+            row.add(record.notes);
+            break;
         }
-        items.add(row);
       }
-      var converter = ListToCsvConverter(fieldDelimiter: settings.csvFieldDelimiter, textDelimiter: settings.csvTextDelimiter);
-      var csvData = converter.convert(items);
-      return Uint8List.fromList(utf8.encode(csvHead + csvData));
-    } else if (settings.exportFormat == ExportFormat.pdf) {
-      return await PdfCreator().createPdf(records);
+      items.add(row);
     }
-    return Uint8List(0);
+    var converter = ListToCsvConverter(fieldDelimiter: settings.csvFieldDelimiter, textDelimiter: settings.csvTextDelimiter);
+    var csvData = converter.convert(items);
+    return Uint8List.fromList(utf8.encode(csvHead + csvData));
   }
 
   List<BloodPressureRecord> parseCSVFile(Uint8List data) {
@@ -126,9 +135,20 @@ class DataExporter {
     }
     return records;
   }
+
+  Future<Uint8List> copyDBFile() async {
+    var dbPath = await getDatabasesPath();
+
+    if (dbPath != inMemoryDatabasePath) {
+      dbPath = join(dbPath, 'blood_pressure.db');
+    }
+    return File(dbPath).readAsBytes();
+
+  }
 }
 
 enum ExportFormat {
   csv,
-  pdf
+  pdf,
+  db
 }
\ No newline at end of file
lib/model/settings_store.dart
@@ -279,6 +279,8 @@ class Settings extends ChangeNotifier {
         return ExportFormat.csv;
       case 1:
         return ExportFormat.pdf;
+      case 2:
+        return ExportFormat.db;
       default:
         assert(false);
         return ExportFormat.csv;
@@ -293,6 +295,9 @@ class Settings extends ChangeNotifier {
       case ExportFormat.pdf:
         _prefs.setInt('exportFormat', 1);
         break;
+      case ExportFormat.db:
+        _prefs.setInt('exportFormat', 2);
+        break;
       default:
         assert(false);
     }
lib/screens/subsettings/export_import_screen.dart
@@ -75,6 +75,7 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
               items: [
                 DropdownMenuItem(value: ExportFormat.csv, child: Text(AppLocalizations.of(context)!.csv)),
                 DropdownMenuItem(value: ExportFormat.pdf, child: Text(AppLocalizations.of(context)!.pdf)),
+                DropdownMenuItem(value: ExportFormat.db, child: Text(AppLocalizations.of(context)!.db)),
               ],
               onChanged: (ExportFormat? value) {
                 if (value != null) {
@@ -146,8 +147,8 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
             ];
           }
 
-          // warn banner when
-          if (_showWarnBanner && (settings.exportFormat != ExportFormat.csv ||
+          // warn banner when the exported data can't be imported
+          if (_showWarnBanner && ![ExportFormat.csv, ExportFormat.db].contains(settings.exportFormat) ||
               settings.exportCsvHeadline == false ||
               !(
                   (settings.exportItems.contains('timestampUnixMs') || settings.exportItems.contains('isoUTCTime')) &&
@@ -156,7 +157,7 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
                   settings.exportItems.contains('pulse') &&
                   settings.exportItems.contains('notes')
               )
-          )) {
+          ) {
             options.insert(0, MaterialBanner(
               padding: const EdgeInsets.all(20),
               content: Text(AppLocalizations.of(context)!.exportWarnConfigNotImportable),
@@ -208,13 +209,17 @@ class _ExportImportScreenState extends State<ExportImportScreen> {
                       }
                       var fileContents = await DataExporter(settings).createFile(entries);
 
-                      String filename = 'blood_press_${DateTime.now().toIso8601String()}'
+                      String filename = 'blood_press_${DateTime.now().toIso8601String()}';
                       switch(settings.exportFormat) {
                         case ExportFormat.csv:
                           filename += '.csv';
                           break;
                         case ExportFormat.pdf:
                           filename += '.pdf';
+                          break;
+                        case ExportFormat.db:
+                          filename += '.db';
+                          break;
                       }
                       String path = await FileSaver.instance.saveFile(name: filename, bytes: fileContents);