[Flutter] DB Join (카테고리 Table)

Comely·2024년 11월 14일

Flutter

목록 보기
7/26

Schedule Table에 Category Table을 추가하려고 합니다.
먼저 CategoryTable을 만들고, ScheduleTable에 추가하겠습니다.

**Table 생성시 앱을 삭제후 처음부터 다시 실행해야 합니다.

category.dart

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(),
      )();
}

기존 table에 추가

.references(CategoryTable, #id)

schedule.dart

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(),
      )();
}

drift.dart (Table 추가)

CategoryTable 추가 후 dart run build_runner build를 실행합니다.

(tables: [
  ScheduleTable,
  CategoryTable,
])

schedule_with_category.dart 생성

class ScheduleWithCategory {
  final CategoryTableData category;
  final ScheduleTableData schedule;

  ScheduleWithCategory({
    required this.category,
    required this.schedule,
  });
}

drift.dart (query 추가)

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
profile
App, Web Developer

0개의 댓글