Schedule Table에 Category Table을 추가하려고 합니다.
먼저 CategoryTable을 만들고, ScheduleTable에 추가하겠습니다.
**Table 생성시 앱을 삭제후 처음부터 다시 실행해야 합니다.
class CategoryTable extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get color => text()();
//Mygration 주의 사항
//이미 존재하는 데이터가 있기 때문에 초기 설정시
//null or Default 설정을 해야 합니다.
IntColumn get randomNumber => integer().nullable()();
IntColumn get randomNumber2 => integer().withDefault(const Constant(0))();
DateTimeColumn get createdAt => dateTime().clientDefault(
() => DateTime.now().toUtc(),
)();
}
.references(CategoryTable, #id)
class ScheduleTable extends Table {
IntColumn get id => integer().autoIncrement()();
IntColumn get startTime => integer()();
IntColumn get endTime => integer()();
TextColumn get content => text()();
DateTimeColumn get date => dateTime()();
/// 카테고리
IntColumn get colorId => integer().references(
CategoryTable,
#id,
)();
/// 일정 생성날짜시간
DateTimeColumn get createdAt => dateTime().clientDefault(
() => DateTime.now().toUtc(),
)();
}
CategoryTable 추가 후 dart run build_runner build를 실행합니다.
(tables: [
ScheduleTable,
CategoryTable,
])
class ScheduleWithCategory {
final CategoryTableData category;
final ScheduleTableData schedule;
ScheduleWithCategory({
required this.category,
required this.schedule,
});
}
Stream<List<ScheduleWithCategory>> streamSchedules(
DateTime date,
) {
final query = select(scheduleTable).join([
innerJoin(
categoryTable,
categoryTable.id.equalsExp(
scheduleTable.colorId,
),
),
]) //필터링
..where(scheduleTable.date.equals(date));
return query.map((row) {
final schedule = row.readTable(scheduleTable);
final category = row.readTable(categoryTable);
return ScheduleWithCategory(category: category, schedule: schedule);
}).watch(); //Stream + watch