main
1import 'dart:async';
2
3import 'package:health_data_store/src/database_manager.dart';
4import 'package:health_data_store/src/repositories/blood_pressure_repository.dart';
5import 'package:health_data_store/src/repositories/blood_pressure_repository_impl.dart';
6import 'package:health_data_store/src/repositories/bodyweight_repository.dart';
7import 'package:health_data_store/src/repositories/bodyweight_repository_impl.dart';
8import 'package:health_data_store/src/repositories/medicine_intake_repository.dart';
9import 'package:health_data_store/src/repositories/medicine_intake_repository_impl.dart';
10import 'package:health_data_store/src/repositories/medicine_repository.dart';
11import 'package:health_data_store/src/repositories/medicine_repository_impl.dart';
12import 'package:health_data_store/src/repositories/note_repository.dart';
13import 'package:health_data_store/src/repositories/note_repository_impl.dart';
14import 'package:health_data_store/src/repositories/repository.dart';
15import 'package:sqflite_common/sqflite.dart';
16
17/// Factory class for objects that provide access to the health database.
18///
19/// Ensures that the classes are instantiated for which the table schemes in the
20/// db fit and creates ensures that the db schema is created and updated where
21/// necessary.
22class HealthDataStore {
23 HealthDataStore._create(this._dbMngr);
24
25 DatabaseManager _dbMngr;
26
27 /// Initializes objects from [db].
28 ///
29 /// [db] must be exclusive to the package and will be initialized by it. The
30 /// library maintains the version and is responsible for update operations.
31 ///
32 /// After loading the database a cleanup of unused data is performed which may
33 /// decrease database performance in the first milliseconds after being
34 /// returned. This is done to improve performance while interacting with the
35 /// database.
36 ///
37 /// When loading a database as [isReadOnly] no automatic changes to the
38 /// database are made. It will however not protect you from manually
39 /// attempting to modify the stored contents (e.g. in [Repository] methods).
40 static Future<HealthDataStore> load(Database db,
41 [bool isReadOnly = false]) async {
42 // TODO: loading readOnly dbs
43 assert(db.isOpen);
44 final mngr = await DatabaseManager.load(db);
45 if (!isReadOnly) {
46 unawaited(mngr.performCleanup());
47 }
48 return HealthDataStore._create(mngr);
49 }
50
51 /// Repository for blood pressure data.
52 BloodPressureRepository get bpRepo => BloodPressureRepositoryImpl(_dbMngr.db);
53
54 /// Repository for notes.
55 NoteRepository get noteRepo => NoteRepositoryImpl(_dbMngr.db);
56
57 /// Repository for medicines.
58 MedicineRepository get medRepo => MedicineRepositoryImpl(_dbMngr.db);
59
60 /// Repository for intakes.
61 MedicineIntakeRepository get intakeRepo =>
62 MedicineIntakeRepositoryImpl(_dbMngr.db);
63
64 /// Repository for weight data.
65 BodyweightRepository get weightRepo => BodyweightRepositoryImpl(_dbMngr.db);
66}