[Flutter/Firestore] Firestore로 모델에 데이터 CREATE, READ하기 in Clean Archiecture

qianshixun·2023년 10월 31일
0

Flutter

목록 보기
3/3

Create

freezed를 통해

import 'package:freezed_annotation/freezed_annotation.dart';

part 'timetable_model.freezed.dart';
part 'timetable_model.g.dart';


class Timetable with _$Timetable {
  const factory Timetable({
    required String title,
    required String subTitle,
    required String professor,
    required int color, // 0 = color1, 1 = color2 --- 3 = color4
    required int startHr,
    required int startMin,
    required int endHr,
    required int endMin,
    required int day, // position
}) = _Timetable;

  factory Timetable.fromJson(Map<String, dynamic> json) => _$TimetableFromJson(json);
}

이러한 모델을 만들어놨다. 가장 아래 코드는 json을 파싱하는 코드이다
직접 만즐 수 있으나 아마 다 freezed를 많이 이용할 거라 생각한다

Firestore에 Create하기

Future<void> addTimetable(Timetable timetable) async {
    await db.collection("test").doc().set(Timetable(
      title : timetable.title,
      professor: timetable.professor,
      subTitle : timetable.subTitle,
      color : timetable.color,
      startHr : timetable.startHr,
      startMin : timetable.startMin,
      endHr : timetable.endHr,
      endMin : timetable.endMin,
      day : timetable.day,
    ).toJson());
  }

아까 작성한 table 모델을 firestore에 넣으려면 db를 선언해야하는데

FirebaseFirestore db = FirebaseFirestore.instance;

이런 식으로 작성한다.
나는 Provider(di)쪽에 해당 라인을 작성했다
만일 Provider를 사용하지 않는다면 알맞은 방법으로 참고해서 바꿔주면 된다

또한 doc을 비워두면 임의로 난수를 설정하므로 원하는 쿼리가 있다면 해당 공란에 작성하면 된다

주의할점

Future<void> addTimetable(Timetable timetable) async {
    await db.collection("test").doc().set(Timetable({
      title : timetable.title,
      professor: timetable.professor,
      subTitle : timetable.subTitle,
      color : timetable.color,
      startHr : timetable.startHr,
      startMin : timetable.startMin,
      endHr : timetable.endHr,
      endMin : timetable.endMin,
      day : timetable.day,
     })
    );

이런식으로 넣어버리면 Firestore에는 똑같이 보이지만 Json으로 파싱할 수 없기 때문에 오류가 발생한다.

READ

데이터를 읽어오기 위해서는

 Future<List<Timetable>> getTimetables() async {
    QuerySnapshot<Map<String, dynamic>> snapshot = await db.collection("test").get();
    List<Timetable> result = snapshot.docs.map((e) => Timetable.fromJson(e.data())).toList();
    print(result);
    return result;
  }

test라는 collection의 스냅샷을 저장하고 Json을 파싱해준다. 그리고 list 형태로 리턴해서 사용하면 된다

정리

이번 글은 클린아키텍처에서 Firestore에 데이터를 넣은 방법을 정리하였다 Update와 Delete는 더 쉬운 기능이니 기회가 있다면 다음 포스팅에 작성해보도록 할 것이다

profile
My Flutter Develog.

0개의 댓글