import 'package:path/path.dart' as p; 이 부분이 이해가 되지 않아 import한 패키지의 기능과 as p 를 쓴 이유가 궁금해패키지의 기능:
package:path는 운영체제에 맞는 파일 경로 처리를 돕는 유틸리티 패키지입니다.join), 파일 이름만 추출하거나(basename), 확장자를 바꿀 수 있는 기능을 제공합니다.as p의 이유:
p.join()으로 path 패키지의 join 함수임을 명확히 합니다.예시:
import 'package:path/path.dart' as p;
void main() {
final folder = "/Users/flutter";
final fileName = "database.db";
final fullPath = p.join(folder, fileName);
print(fullPath); // 결과: /Users/flutter/database.db
}
part 'drift.g.dart';의 기능과 사용법이 궁금해기능:
part는 다트의 라이브러리 시스템에서 여러 파일을 하나로 묶는 역할을 합니다.drift.g.dart는 Drift 패키지가 테이블, DAO 등의 정보를 기반으로 자동 생성한 파일입니다.사용법:
part 키워드로 자동 생성된 파일을 포함하면, 정의한 테이블과 데이터베이스를 사용할 수 있습니다.flutter pub run build_runner build예시:
part 'drift.g.dart';
(tables: [ScheduleTable])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
int get schemaVersion => 1;
}
@DriftDatabase()의 기능이 궁금해기능:
tables 매개변수에 테이블 클래스를 전달하여 데이터베이스 구조를 정의합니다.예시:
(tables: [ScheduleTable])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
int get schemaVersion => 1;
}
schemaVersion의 기능과 사용법이 궁금해기능:
schemaVersion은 마이그레이션(테이블 추가, 수정 등) 시 Drift가 변경을 처리할 수 있도록 합니다.사용법:
schemaVersion = 1로 설정합니다.예시:
int get schemaVersion => 2;
MigrationStrategy get migration => MigrationStrategy(
onUpgrade: (migrator, from, to) async {
if (from == 1) {
await migrator.addColumn(scheduleTable, scheduleTable.newColumn);
}
},
);
LazyDatabase 이게 무슨 클래스인지, 기능과 사용법이 궁금해LazyDatabase는 Future를 반환하는 콜백으로 데이터베이스를 초기화합니다.LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'database.db'));
return NativeDatabase(file);
});
}p.join의 기능이 운영체제와 상관없이 경로를 합쳐준다고 했는데, 자세히 설명해줘p.join의 기능:\/final folder = "C:\\Users\\flutter"; // Windows 경로
final fileName = "db.sqlite";
final filePath = p.join(folder, fileName);
print(filePath); // 결과: C:\Users\flutter\db.sqliteapplyWorkaroundToOpenSqlite3OnOldAndroidVersions()를 적는 이유가 궁금해if (Platform.isAndroid) {
await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
}sqlite3.tempDirectory = cachebase.path; 이 코드를 쓰는 이유가 궁금해getTemporaryDirectory()로 얻은 디렉토리를 설정합니다.final tempDir = await getTemporaryDirectory();
sqlite3.tempDirectory = tempDir.path;테이블 모델 정의:
Table 클래스를 상속하여 테이블을 정의합니다.class ScheduleTable extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(min: 1, max: 100)();
}
데이터베이스 클래스 생성:
@DriftDatabase 어노테이션과 함께 데이터베이스를 정의합니다.(tables: [ScheduleTable])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
int get schemaVersion => 1;
}
build_runner 실행:
flutter pub run build_runner build
자동 생성 파일 사용:
drift.g.dart 파일을 포함하여 데이터베이스 연산을 수행합니다.final database = AppDatabase();
database.insertSchedule(ScheduleTableCompanion(title: Value('New Task')));