Flutter

[ Flutter ] sqlite & drift 사용하기 - 2편

사과씨앗 2022. 12. 18. 17:22
728x90
반응형

이번 글에서는 지난 글에 이어서 drift를 사용하여 CRUD 하는 방법을 알아보도록 하겠습니다.

 

이전 글을 못 보신 분들은 아래 링크를 참고해 주세요 

https://itmoon.tistory.com/104

 

[ Flutter ] sqlite & drift 사용하기 -1편

안녕하세요 이번 글에서는 데이터를 핸드폰에 저장하기 위한 sqlite를 사용해 보겠습니다. 프로젝트 구조 pubspec.yaml dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. #

itmoon.tistory.com

 

CRUD에 사용할 메서드를 만들어 줍시다.

 

drift_database.dart

import 'dart:io';

import 'package:database/model/member.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as P;

// 여기는 자동생성 할 파일
part 'drift_database.g.dart';

@DriftDatabase(
  tables: [
    Member,
  ],
)

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

  @override
  int get schemaVersion => 1;

  // 생성 메소드 Future<int> 선언하여 insert count 를 받을수 있다.
  Future<int> createMember(MemberCompanion data) =>
      into(member).insert(data);

  // 전체 member 를 가져올 수 있다.MemberData 는 .g 파일에 생성되어 있다.
  Future<List<MemberData>> getMembers() =>
      select(member).get();

  // 단건의 member 를 조회할 수 있다.
  // 조건문 사용시 아래처럼 두가지 방법으로 사용할 수 있다.
  // select(member).where((tbl) => tbl.id.equals(id)).getSingle() 이렇게 사용할 경우
  // select(member) 에 대해서 getSingle() 함수가 호출 되는것이 아닌
  // where((tbl) => tbl.id.equals(id)) 이 타겟으로 되어 에러가 난다.
  Future<MemberData> getMember(int id) =>
      (select(member)..where((tbl) => tbl.id.equals(id))).getSingle();

  Future<MemberData> getMember2(int id) {
    final query = select(member);
    query.where((tbl) => tbl.id.equals(id));
    return query.getSingle();
  }

  // member delete
  Future<int> removeMember(int id)=>
      (delete(member)..where((tbl) => tbl.id.equals(id))).go();

  // member update
  Future<int> updateMember(int id, MemberCompanion m)=>
      (update(member)..where((tbl) => tbl.id.equals(id))).write(m);
}


LazyDatabase _openConnection(){
  return LazyDatabase(() async{
    final dbFolder = await getApplicationDocumentsDirectory();// 앱 전용으로 사용할 수 있는 폴더
    final file = File(P.join(dbFolder.path,'db.sqlite')); // 저장할 db 파일 생성
    return NativeDatabase(file);
  });
}

 

그다음 만들어둔 메서드를 사용하기 위한 세팅을 해줍시다.

 

main.dart

 

import 'package:database/screen/home_screen.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

import 'database/drift_database.dart';



void main() {

  WidgetsFlutterBinding
      .ensureInitialized(); // flutter 가 준비가 될 떄 까지 기다린다. runApp 을 실행하면 자동으로 실행되나 runApp 전에 실행하는 코드가 있으면 이미 실행시켜 준다.
  final database = LocalDatabase();
  GetIt.I.registerSingleton<LocalDatabase>(database); // 어디에서든 해당 데이터베이스를 사용할 수 있다.

  runApp(MaterialApp(
    home: HomeScreen(),
  ));
}

 

여기까지 CRUD를 하기 위한 작업을 해보았습니다.

다음 편 에서는 화면에서 직접 사용하여 보겠습니다.

감사합니다 ^^ 

728x90
반응형