configure method

  1. @override
Future<void> configure({
  1. required DataEndPoint dataEndPoint,
  2. required SmartphoneDeployment deployment,
  3. required Stream<Measurement> measurements,
})
override

Configure the data manager by specifying the study deployment, the dataEndPoint, and the stream of measurements events to handle.

Implementation

@override
Future<void> configure({
  required DataEndPoint dataEndPoint,
  required SmartphoneDeployment deployment,
  required Stream<Measurement> measurements,
}) async {
  assert(dataEndPoint is SQLiteDataEndPoint);
  await super.configure(
    dataEndPoint: dataEndPoint,
    deployment: deployment,
    measurements: measurements,
  );

  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: 2,
    singleInstance: true,
    onCreate: (Database db, int version) async {
      // when creating the database, create the measurements table
      debug("$runtimeType - Creating '$MEASUREMENT_TABLE_NAME' table");
      await db.execute(
        'CREATE TABLE $MEASUREMENT_TABLE_NAME ('
        '$ID_COLUMN INTEGER PRIMARY KEY AUTOINCREMENT, '
        // SQLite does not have a separate Boolean storage class. Instead,
        // boolean values are stored as integers 0 (false) and 1 (true).
        '$UPLOADED_COLUMN INTEGER, '
        '$DEPLOYMENT_ID_COLUMN TEXT, '
        '$TRIGGER_ID_COLUMN INTEGER, '
        '$DEVICE_ROLE_NAME_COLUMN TEXT, '
        '$DATATYPE_COLUMN TEXT, '
        '$RECORD_ID_COLUMN TEXT, '
        '$MEASUREMENT_COLUMN TEXT, '
        'UNIQUE($DEPLOYMENT_ID_COLUMN, $DEVICE_ROLE_NAME_COLUMN, '
        '$RECORD_ID_COLUMN))',
      );

      debug("$runtimeType - '$databaseName' DB created");
    },
    onUpgrade: (Database db, int oldVersion, int newVersion) async {
      if (oldVersion < 2) {
        // The column/index may already exist, so guard both statements
        // instead of crashing the upgrade on "already exists".
        final columns = await db.rawQuery(
          'PRAGMA table_info($MEASUREMENT_TABLE_NAME)',
        );
        final hasRecordIdColumn = columns.any(
          (column) => column['name'] == RECORD_ID_COLUMN,
        );
        if (!hasRecordIdColumn) {
          await db.execute(
            'ALTER TABLE $MEASUREMENT_TABLE_NAME '
            'ADD COLUMN $RECORD_ID_COLUMN TEXT',
          );
        }
        await db.execute(
          'CREATE UNIQUE INDEX IF NOT EXISTS measurements_record_id '
          'ON $MEASUREMENT_TABLE_NAME('
          '$DEPLOYMENT_ID_COLUMN, $DEVICE_ROLE_NAME_COLUMN, '
          '$RECORD_ID_COLUMN)',
        );
      }
    },
  );
}