본문 바로가기

[flutter, drift, SQLite] New 플러터와 드리프트(drift)로 간단한 메모장 만들기 - 2탄(컬럼 추가, 마이그레이션)

ironwhale 2023. 6. 16.

이번에는 마이그레이션을 통해 새로운 컬럼을 추가해보도록 하겠습니다. 


Drift에서 컬럼 추가하기 목차

1. 테이블 클래스에 컬럼을 추가 

2. MyDatabse클래스에 마이그레이션 코드 작성

3. 코드제너레이션 


1. 테이블 클래스에 컬럼을 추가 

기존에 없었던 folder라는 컬럼을 추가하였습니다. withDefault를 통해 기본값을 설정하였구요. nullable을 통해 널값이 가능하도록 하였습니다. 

import 'package:drift/drift.dart';

class Memos extends Table {
  IntColumn get id => integer().autoIncrement()();

  TextColumn get content => text()();
  TextColumn get folder => text().withDefault(const Constant("기본")).nullable()();
}

2. MyDatabase 클래스에 마이그레이션 코드 작성

int get schemaVersion => 2; 에서 1을 2로 바꾸어 새로운 버전임을 명시합니다.

그리고 MigrationStrategy get migration을 통해 각 버전별로 테이블을 추가하거나 컬럼을 추가등 필요한 내용을 조건문으로 코드를 작성합니다. 

 

컬럼만 추가하기 때문에 from<2 즉 1버전이면 m.addColumn(테이블, 추가할 컬럼) 과 같은 방식으로 기존 테이블에 컬럼을 추가할 수 있습니다. 

import 'dart:io';

import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:drift_train/drift/models.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

part 'drift_helper.g.dart';

@DriftDatabase(tables: [Memos])
class Mydatabase extends _$Mydatabase {
  Mydatabase() : super(_openDb());

  @override
  int get schemaVersion => 2;

  @override
  MigrationStrategy get migration {
    return MigrationStrategy(
        onCreate: (Migrator m) async {
          await m.createAll();
        },
        onUpgrade: (Migrator m, int from, int to) async {
          if (from < 2) {
            await m.addColumn(memos, memos.folder);
          }
        }
    );
  }
}

LazyDatabase _openDb() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase.createInBackground(file);
  });
}

2. 코드 제너레이션 

아마 처음에 위와 같이 작성하면 오류가 뜰텐데 코드 제너레이션을 하면 자연스럽게 오류가 사라지고 새로운 컬럼이 생기게 됩니다. 

 


마치며

이번에는 UI부분 보다는 drift를 사용하여 SQLite와 플러터의 연결에 초점을 맞추어 공부해보았습니다. 보통은 파이어베이스를 사용해서 백엔드를 구성을 많이하는데 간단한 프로그램은 drift를 이용해서 로컬 RDB인 SQLite를 사용하는 것도 좋은 선택인거 같습니다. 

 

깃허브 주소 

https://github.com/ironwhale1014/flutter_drift_memo

 

GitHub - ironwhale1014/flutter_drift_memo

Contribute to ironwhale1014/flutter_drift_memo development by creating an account on GitHub.

github.com

 

댓글