[Flutter, firebase]파이어 스토어에서 데이터 저장하고 불러오기
flutter 파이어베이스 데이터 가져오기 순서
- 파이어베이스에 프로젝트를 생성한다.
- dart package 설치
- cloud_firestore
- firebase_core
- 프로젝트와 파이어베이스를 연결한다.
- flutterfire configure 명령어를 실행(저는 CLI를 이용하였습니다. )
- 파이어 베이스 초기화
- 파이어 스토어 데이터 베이스 만들고 규칙 설정한다.
- 파이어 스토어에 CRUD 기능을 구현할 클래스를 만든다.
- 데이터를 객체로 만든다.
- 불러올때는 fromJson 사용
- 저장할때 tojson 함수 사용
- 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);
}
}
'플러터관련 정보 > 파이어 베이스(플러터)' 카테고리의 다른 글
플러터와 파이어베이스 2탄- 파이어스토어에 자료 저장하기(create)-(2) (0) | 2022.06.16 |
---|---|
플러터와 파이어베이스 2탄- 파이어스토어에 자료 저장하기(create)-(1) (0) | 2022.06.14 |
플러터와 파이어베이스 1탄- 플러터 3.0 업데이트 후 파이어베이스(firebase) 연동(2) (0) | 2022.06.07 |
[flutter,firestore] 파이어 스토어 필터링 후 정렬하기 - 복합색인, 태그검색 기능 구현 (0) | 2022.06.06 |
[flutter, firebase] 핵심만 콕콕!! 플러터와 파이어베이스 세팅하기 with Firebase CLI 사용 (0) | 2022.03.21 |
댓글