init method

Future<void> init()

Initialize the persistence layer and the database.

Implementation

Future<void> init() async {
  info('Initializing $runtimeType...');
  _databasePath ??= await getDatabasesPath();

  // open the database - make sure to use the same database across app (re)start
  _database = await openDatabase(
    databaseName,
    version: 1,
    singleInstance: true,
    onCreate: (Database db, int version) async {
      // when creating the database, create the tables
      await db.execute(
        'CREATE TABLE $STUDY_TABLE_NAME ('
        '$STUDY_ID_COLUMN TEXT, '
        '$STUDY_DEPLOYMENT_ID_COLUMN TEXT, '
        '$DEVICE_ROLE_NAME_COLUMN TEXT, '
        '$PARTICIPANT_ID_COLUMN TEXT, '
        '$PARTICIPANT_ROLE_NAME_COLUMN TEXT, '
        '$CREATED_ON_COLUMN TEXT, '
        '$UPDATED_ON_COLUMN TEXT, '
        '$DEPLOYED_ON_COLUMN TEXT, '
        '$SAMPLING_STATUS_COLUMN TEXT, '
        '$DEPLOYMENT_STATUS_COLUMN TEXT, '
        '$DEPLOYMENT_COLUMN TEXT)',
      );

      await db.execute(
        'CREATE TABLE $TASK_QUEUE_TABLE_NAME ('
        '$ID_COLUMN INTEGER PRIMARY KEY, '
        '$TASK_ID_COLUMN TEXT, '
        '$STUDY_DEPLOYMENT_ID_COLUMN TEXT, '
        '$DEVICE_ROLE_NAME_COLUMN TEXT, '
        '$TASK_COLUMN TEXT)',
      );

      debug('$runtimeType - $databaseName DB created');
    },
  );

  // Listen to changes to studies in the client repository so we can save them.
  SmartphoneClientRepository().studyStatusEvents.listen(
    (event) => updateStudy(event.study),
  );

  // Listen to changes to the app task queue so we can save them.
  AppTaskController().userTaskEvents.listen((task) => saveUserTask(task));

  info('$runtimeType - SQLite DB initialized - file: $databaseName');
}