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}