configure method
Future<void>
configure({
- required DataEndPoint dataEndPoint,
- required SmartphoneDeployment deployment,
- 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)',
);
}
},
);
}