티스토리 뷰

출처 : https://pub.dev/packages/drift

 

drift | Dart Package

Drift is a reactive library to store relational data in Dart and Flutter applications.

pub.dev

 

[라이브러리] Drift

flutter 에서 sqlite를 ORM 으로 작성하게 해주는 라이브러리

설치

flutter pub add drift
flutter pub add sqlite3_flutter_libs
flutter pub add path_provider
flutter pub add path

flutter pub add --dev drift_dev
flutter pub add --dev build_runner

 

Todo table 작성

import 'package:drift/drift.dart';

// Table을 상속받아서 작성
class Todo extends Table {
  // 주의점은 끝에 괄호가 두개
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text()();
  TextColumn get context => text().nullable()();
  TextColumn get status => text()();
}

 

Drift 헬퍼 함수 작성

// 파일명을 `db_helper.dart` 로 생성했을 경우
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';

// 중요!! `파일명.g.dart` 꼭 작성
// 빌드 전에는 에러 표시나는 것이 정상
part 'db_helper.g.dart';

// 아래에서 만들 table class를 넣어준다.
@DriftDatabase(tables: [Todo])
// _$클래스명 을 붙여서 상속 받는다
// 빌드전에는 에러 나는 것이 정상
class DbHelper extends _$DbHelper {
  DbHelper() : super(_openConnection());

  // 스키마 버전
  @override
  int get schemaVersion => 1;
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    // sqlite 를 저장할 파일명
    final file = File(p.join(dbFolder.path, 'todo.sqlite'));
    return NativeDatabase.createInBackground(file);
  });
}

 

빌드

# 빌드 명령
flutter pub run build_runner build

 

기능 구현 ( 예제에서는 list, insert , delete)

// 위에서 생성한 `db_helper.dart` 에 내용 추가
@DriftDatabase(tables: [Todo])
class DbHelper extends _$DbHelper {
  //// 내용 추가 부분 -------------------------------------------
  
  // 빌드를 돌리고나면 todos와 TodoData 가 자동완성된다.
  // todos 내가 만든 클래스를 소문자 + 복수
  // TodoCompanion 은 내가 만든 클래스 + Companion 이 자동으로 부여된다.
  // 데이터를 넣을때에는 TodoCompanion 으로 넣어야하며, 요소는 Value로 감싸서 입력
  Future<int> addTodo(TodoData todoData) {
    return into(todo).insert(todoData);
  }

  Future<List<TodoData>> findAll() {
    return select(todo).get();
  }

  Future resetDB() {
    return delete(todo).go();
  }

  Future<TodoData?> find(TodoData todoData) {
    return (select(todo)..where((t) => t.id.equals(todoData.id)))
        .getSingleOrNull();
  }
}
댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday