728x90
Flutter 에서 로컬 데이터베이스 패키지 중 하나인 Drift 에 대해 알아보자.
Drift 는 Sqlflite 와 다르게 ORM 방식의 데이터베이스이다.
ORM 은 Object Relational Mapping (객체-관계 매핑), 쉽게 말해서 객체와 관계형 데이터베이스의 데이터를 연결해주는 것이다.
Drift로 SQLite DB 생성부터 관리
- 테이블 정의하기
- DB 생성하기
- DB 관리파일 생성(g.dart)
- CRUD 코드 추가하기
먼저 pubspec.yaml 파일에 추가할 내용은 https://drift.simonbinder.eu/docs/getting-started/ 에 나와 있다.
name: drift_ex
description: A new Flutter project.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: '>=3.1.5 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
drift: ^2.13.0
sqlite3_flutter_libs: ^0.5.0
path_provider: ^2.0.0
path: ^1.8.3
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
drift_dev: ^2.13.0
build_runner: ^2.4.6
flutter:
uses-material-design: true
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
|
테이블 정의하기
import 'package:drift/drift.dart';
/***
* CONTENT, DATE, STARTTIME, ENDTIME, COLORID, CREATEDAT
*/
class Schedules extends Table {
IntColumn get id => integer().autoIncrement()(); // PRIMARY KEY
TextColumn get content => text()(); // 내용
DateTimeColumn get date => dateTime()(); // 일정날짜
IntColumn get startTime => integer()(); // 시작 시간
IntColumn get endTime => integer()(); // 종료 시간
IntColumn get colorId => integer()(); // Category Color Table ID
DateTimeColumn get createAt => dateTime().clientDefault(() => DateTime.now(),)();
}
|
import 'package:drift/drift.dart';
class CategoryColors extends Table {
// PRIMARY KEY
IntColumn get id => integer().autoIncrement()();
// 색상 코드
TextColumn get hexCode => text()();
}
|
DB 생성하기
schemaVersion은 일반적으로 1부터 시작하고 Table의 변화가 있을때 1씩 올려준다.
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import '../model/category_color.dart';
import '../model/schedule.dart';
part 'schedule_database.g.dart';
@DriftDatabase(
tables: [
Schedules,
CategoryColors,
],
)
class LocalDatabase extends _$LocalDatabase {
LocalDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
// LazyDatabase에서는 db파일이 저장될 폴더 위치를 지정해준다.
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'db.sqlite'));
return NativeDatabase(file);
});
}
|
g.dart 코드 자동 생성하기
아래와 같이 터미널에서 flutter pub run build_runner build 명령어를 입력한다.
CRUD 코드 추가하기
class LocalDatabase extends _$LocalDatabase {
LocalDatabase() : super(_openConnection());
Future<int> createSchedule(SchedulesCompanion data) =>
into(schedules).insert(data);
Future<int> createCategoryColor(CategoryColorsCompanion data) =>
into(categoryColors).insert(data);
Future<List<CategoryColor>> getCategoryColors() =>
select(categoryColors).get();
// getSingle : 하나의 데이터만 가져와라.
Future<Schedule> getScheduleById(int id) =>
(select(schedules)..where((tbl) => tbl.id.equals(id))).getSingle();
Future<int> updateScheduleById(int id, SchedulesCompanion data) =>
(update(schedules)..where((tbl) => tbl.id.equals(id))).write(data);
// 삭제한 ID의 int 값을 리턴 받는다.
Future<int> removeSchedule(int id) =>
(delete(schedules)..where((tbl) => tbl.id.equals(id))).go();
Stream<List<ScheduleWithColor>> watchSchedules(DateTime date) {
final query = select(schedules).join([
innerJoin(categoryColors, categoryColors.id.equalsExp(schedules.colorId))
]);
query.where(schedules.date.equals(date));
query.orderBy(
[
// asc -> ascending 오름차순
// desc -> descending 내림차순
OrderingTerm.asc(schedules.startTime),
],
);
return query.watch().map(
(rows) => rows
.map(
(row) => ScheduleWithColor(
schedule: row.readTable(schedules),
categoryColor: row.readTable(categoryColors),
),
)
.toList(),
);
}
@override
int get schemaVersion => 1;
}
|
728x90
'Flutter 앱 > Flutter Basic' 카테고리의 다른 글
Flutter Model Class JSON Serialize g.dart 자동 생성 (1) | 2023.11.21 |
---|---|
플러터 미세먼지 공공데이터 API 신청 및 postman 에서 확인 (0) | 2023.11.08 |
Flutter shared_preferences 개념 정리 (0) | 2022.07.26 |
Flutter showDatePicker 함수 : 날짜 선택하기 (0) | 2022.06.26 |
Flutter shared_preferences (0) | 2022.06.20 |