[Flutter] drift, sql

Jinno·2023년 1월 2일
1

Flutter

목록 보기
1/19

1. Model 폴더에 Table 추가
-import drift
-테이블 클래스 생성
-autoIncrement()

import 'package:drift/drift.dart';

class Schedules extends Table {
  IntColumn get id => integer().autoIncrement()();
 
  TextColumn get content => text()();
  DateTimeColumn get date => dateTime()();
  IntColumn get colorId => integer()();
  TextColumn get hexCode => text()();
  DateTimeColumn get createdAt => dateTime().clientDefault(
        () => DateTime.now(),
      )();
}

2.database 폴더에 drift_database.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';

// part로 현재 파일.g.
part 'drift_database.g.dart';

// model 폴더에 추가한 테이블 설정
@DriftDatabase(
  tables: [
    Schedules,    
  ],
)

class LocalDatabase extends _$LocalDatabase {
  LocalDatabase() : super(_openConnection());  

  @override
  int get schemaVersion => 1;
}

//getApplicationDocumentsDirectory로 해당 기기에서 sql이 저장되는 폴더경로 획득
LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase(file);
  });
}

3. Terminal에서 아래 명령어 실행해서 code generation
-'flutter pub run build_runner build'
-drift_database.g.dart 파일 생성됨


4.sql관련 함수추가
-LocalDatabase class안에 추가
-into('소문자로 테이블네임')

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

  @override
  int get schemaVersion => 1; //throw UnimplementedError();
}

5.main.dart에서 사용
-table명Companion을 사용
-값 입력은 Value(data)로 적용

import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:mycalendar/database/drift_database.dart';

const DEFAULT_COLORS = [
  'F44336',
  'FF9800',
  'FFEB3B',
];

void main() async {
  final database = LocalDatabase();
  final colors = await database.getCategoryColors();

  if (colors.isEmpty) {
    for (String hexCode in DEFAULT_COLORS) {
      await database.createCategoryColor(
        CategoryColorsCompanion(hexCode: Value(hexCode)),
      );
    }
  }

  runApp(
    MaterialApp(     
      home: HomeScreen(),
    ),
  );
}
profile
Innovation, 기록용

0개의 댓글