본문 바로가기

[Flutter, firebase]파이어 스토어에서 데이터 저장하고 불러오기

ironwhale 2022. 4. 13.

flutter 파이어베이스 데이터 가져오기 순서

  1. 파이어베이스에 프로젝트를 생성한다.
  2. dart package 설치
    • cloud_firestore
    • firebase_core
  3. 프로젝트와 파이어베이스를 연결한다.
    • flutterfire configure 명령어를 실행(저는 CLI를 이용하였습니다. )
  4. 파이어 베이스 초기화
  5. 파이어 스토어 데이터 베이스 만들고 규칙 설정한다.
  6. 파이어 스토어에 CRUD 기능을 구현할 클래스를 만든다.
  7. 데이터를 객체로 만든다.
    • 불러올때는 fromJson 사용
    • 저장할때 tojson 함수 사용
  8. CRUD를 처리할 클래스를 만든다.

파이어베이스(파이어스토어) 기본 개념들

Collection

  • Table이랑 비슷한 개념이다.

Document

  • Row, Record와 같이 하나의 데이터 최소 단위

DocumentReference-DocumentSnapshot

  • 특정 다큐먼트의 위치를 나타낸다.
  • 특정 데이터의 위치를 나타낸다.
  • 특정 다큐먼트(데이터)가 필요 할때 사용한다.
  • DocumentReference는 id 처럼 사용하면 된다.
  • 특정 다큐먼트의 실제 데이터는 DocumentSnapshot 형태로 가져온다.
DocumentReference<Map<String, dynamic>> documentReference =
        FirebaseFirestore.instance.collection("motto_db").doc(userKey)
final DocumentSnapshot<Map<String, dynamic>> documentSnapshot =
        await documentReference.get();

CollectionReference - QuerySnapshot

  • 특정 콜렉션 안에 있는 다큐멘트를 가져올때 사용
  • 데이터를 리스트 형태로 가져와서 ListView로 보여 줄때 사용 할수 있다.
CollectionReference<Map<String, dynamic>> collectionReference =
        FirebaseFirestore.instance.collection("motto_db");
QuerySnapshot<Map<String, dynamic>> querySnapshot =
        await collectionReference.get();
//READ 컬렉션 내 모든 데이터를 가져올때
  Future<List<FireModel>> getFireModels() async {
    CollectionReference<Map<String, dynamic>> collectionReference =
        FirebaseFirestore.instance.collection("motto_db");
    QuerySnapshot<Map<String, dynamic>> querySnapshot =
        await collectionReference.get();

    List<FireModel> mottos = [];
    for (var doc in querySnapshot.docs) {
      FireModel fireModel = FireModel.fromQuerySnapshot(doc);
      mottos.add(fireModel);
    }
    return mottos;
  }

FireModel

  • DocumentReference? reference ,this.reference 이것으로 특정 다큐먼트의 위치를 알아
  • 특정 다큐먼트를 삭제하거나 수정할수 있다.
  • Json 형태와 오브젝트 형태로 변환 할수 있는 클래스를 만든다.

Json to Dart에 넣을 형태

{ 
 "motto" : "세계적 클래스의 타이탄들에게는 초능력이 없었다. 대신 그들에게는 뚜렷한 목표(계획)가 있다.",
 "origin" : "타이탄의 도구들 12페이지",
 "date" : "2022-03-29 13:02:21",
 "reference" : "reference"
}
import 'package:cloud_firestore/cloud_firestore.dart';

/// motto : "세계적 클래스의 타이탄들에게는 초능력이 없었다. 대신 그들에게는 뚜렷한 목표(계획)가 있다."
/// origin : "타이탄의 도구들 12페이지"
/// date : "2022-03-29 13:02:21"
/// reference : "reference"

class FireModel {

  FireModel({
    this.motto,
    this.origin,
    this.date,
    this.reference,
  });

  String? motto;
  String? origin;
  Timestamp? date;
  DocumentReference? reference;

  FireModel.fromJson(dynamic json,this.reference) {
    motto = json['motto'];
    origin = json['origin'];
    date = json['date'];
  }

  
FireModel.fromSnapShot(DocumentSnapshot<Map<String, dynamic>> snapshot)
      : this.fromJson(snapshot.data(),snapshot.reference);

  FireModel.fromQuerySnapshot(
      QueryDocumentSnapshot<Map<String, dynamic>> snapshot)
      : this.fromJson(snapshot.data(),snapshot.reference);

// 파이어 베이스로 저장 할때 쓴다. 
  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['motto'] = motto;
    map['origin'] = origin;
    map['date'] = date;
    return map;
  }
}

데이터 저장하고, 불러오고, 수정하고 삭제 하기 구현

  • doc()에 특정키를 넣으면 특정키로 다큐먼트가 생성되고 아니면 랜덤으로 생성 된다.
    • 랜덤으로 생성 할때
      • DocumentReference<Map<String, dynamic>> documentReference = FirebaseFirestore.instance.collection("motto_db").doc();
    • 특정 키로 생성할때
      • DocumentReference<Map<String, dynamic>> documentReference =FirebaseFirestore.instance.collection("motto_db").doc(userkey);
  • 콜렉션 내에 모든 다큐먼트를 불러올때
    • 콜렉션 레퍼런스를 사용한다.
    • querySnapshot.docs을 이용하여 List<DocumentSnapshot> 을 불러올수 있다.
      • QuerySnapshot<Map<String, dynamic>> querySnapshot = await collectionReference.orderBy("date").get();
      • FireModel.fromQuerySnapshot(doc) 을 이용하여 각각의 다큐먼트를 객체로 바꿔 줄수 있다.
  //READ 컬렉션 내 모든 데이터를 가져올때
  Future<List<FireModel>> getFireModels() async {
    CollectionReference<Map<String, dynamic>> collectionReference =
        FirebaseFirestore.instance.collection("motto_db");
    QuerySnapshot<Map<String, dynamic>> querySnapshot =
        await collectionReference.orderBy("date").get();

    List<FireModel> mottos = [];
    for (var doc in querySnapshot.docs) {
      FireModel fireModel = FireModel.fromQuerySnapshot(doc);
      mottos.add(fireModel);
    }
    return mottos;
  }

전체코드

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:mottoapp/data/fire_model.dart';

class FireService {
  static final FireService _fireService = FireService._internal();

  factory FireService() => _fireService;

  FireService._internal();

  // Create
  Future createNewMotto(Map<String, dynamic> json) async {
    DocumentReference<Map<String, dynamic>> documentReference =
        FirebaseFirestore.instance.collection("motto_db").doc();
    final DocumentSnapshot<Map<String, dynamic>> documentSnapshot =
        await documentReference.get();

    if (!documentSnapshot.exists) {
      await documentReference.set(json);
    }
  }

  // READ 각각의 데이터를 콕 집어서 가져올때
  Future<FireModel> getFireModel(String userkey) async {
    DocumentReference<Map<String, dynamic>> documentReference =
        FirebaseFirestore.instance.collection("motto_db").doc(userkey);
    final DocumentSnapshot<Map<String, dynamic>> documentSnapshot =
        await documentReference.get();
    FireModel fireModel = FireModel.fromSnapShot(documentSnapshot);
    return fireModel;
  }

  //READ 컬렉션 내 모든 데이터를 가져올때
  Future<List<FireModel>> getFireModels() async {
    CollectionReference<Map<String, dynamic>> collectionReference =
        FirebaseFirestore.instance.collection("motto_db");
    QuerySnapshot<Map<String, dynamic>> querySnapshot =
        await collectionReference.orderBy("date").get();

    List<FireModel> mottos = [];
    for (var doc in querySnapshot.docs) {
      FireModel fireModel = FireModel.fromQuerySnapshot(doc);
      mottos.add(fireModel);
    }
    return mottos;
  }
//Delete
  Future<void> delFireModel(DocumentReference reference) async {
    await reference.delete();
  }

//Update
  Future<void> updateFireModel(Map<String, dynamic> json,DocumentReference reference) async {
    await reference.set(json);
  }
}

 

 

댓글