iOS/정리
[Swift] Firebase - Realtime Database & Cloud Firestore
용그무스
2022. 6. 22. 01:37
Firebase Database
- 서버리스
- 비관계형 클라우드
- 모바일, 웹앱에 적합
- 대량
- SDK, 클라이언트와 동기화 (HTTP X)
- 오프라인일 때 로컬저장 후 연결 시 동기화
Realtime Database
- json 트리 (데이터 구조가 간단)
- 정렬 || 필터링
- 하위 값까지 전체 검색
- 데이터 계층이 커질 수록 성능이 떨어짐
Cloud FireStore
- 문서, 컬렉션 구조
- 정렬 && 필터링
- 복합 고급 쿼리 제공
- 특정 계층의 값만 검색 가능
Realtime Database
var ref: DatabaseReference!
...
ref = Database.database().reference()
//realtime 데이터베이스 읽기
//레퍼런스가 바라보는 값, 스냅샷 발생
ref.observe(.value) {[weak self] snapshot in
//스냅샷의 타입은 딕셔너리 (실시간 데이터를 레퍼런스에서 지켜보다가 스냅샷이라는 객체로 전달. 가공-타입지정-하여 처리)
guard let value = snapshot.value as? [String: [String: Any]] else {return}
}
//realtime 데이터베이스 쓰기
//데이터 경로를 앎 - 데이터베이스 경로(아이디/isselected)에 값 추가
ref.child("Item\(ID)/수정할_속성").setValue(true)
//키값이 분명하지 않을 때 - 컴포넌트값(id=ex인 객체)을 검색해서 객체 스냅샷을 가져옴
ref.queryOrdered(byChild: "id").queryEqual(toValue: "검색어").observe(.value) {[weak self] snapshot in
guard let self = self,
let value = snapshot.value as? [String: [String: Any]],
let key = value.keys.first else {return}
self.ref.child("\(key)/수정할_속성").setValue(true)
}
//realtime 데이터베이스 삭제
//데이터 경로를 알 때 삭제 - removeValue() 메소드
ref.child("Item\(ID)").removeValue()
//데이터 경로를 알 수 없을 때 삭제 - 수정값을 nil로 업데이트
ref.queryOrdered(byChild: "id").queryEqual(toValue: "검색어").observe(.value) {[weak self] snapshot in
guard let self = self,
let value = snapshot.value as? [String: [String: Any]],
let key = value.keys.first else {return}
self.ref.child(key)
}
Cloud Firestore
var db = Firestore.firestore()
// Firestore 읽기
db.collection("콜렉션명").addSnapshotListener{ snapshot, error in
//snapshot에 document가 있는지 확인
guard let documents = snapshot?.documents else{
print("ERROR : \(String(describing: error))")
return
}
//객체 리스트로 가져오기
//compactMap - documents가 nil 값 반화해도 배열에 저장하지 않음. 옵셔널처리
self.creditCardList = documents.compactMap{
...
}
}
//Firestore 쓰기
//데이터 경로를 앎 - 콜렉션, 문서의 id
db.collection("콜렉션명").document("Item\(ID)").updateData(["수정할_속성": true])
//키값이 분명하지 않을 때 - 컴포넌트값(id=ex인 객체)을 검색(whereField)해서 문서 업뎃
db.collection("콜렉션명").whereField("id", isEqualTo: "검색어").getDocuments{ snapshot, _ in
guard let document = snapshot?.documents.first else{
print("ERROR: Firestore ..")
return
}
document.reference.updateData(["수정할_속성": true])
}
//Firestore 삭제
//데이터 경로를 알 때 삭제 - removeValue() 메소드
db.collection("콜렉션명").document("Item\(ID)").delete()
//데이터 경로를 알 수 없을 때 삭제 - 수정값을 nil로 업데이트
db.collection("콜렉션명").whereField("id", isEqualTo: "검색어").getDocuments{ snapshot, _ in
guard let document = snapshot?.documents.first else{
print("ERROR: Firestore ..")
return
}
document.reference.delete()
}
데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스 | Firebase Documentation
Check out what’s new from Firebase at Google I/O 2022. Learn more 의견 보내기 데이터베이스 선택: Cloud Firestore 또는 실시간 데이터베이스 Firebase는 실시간 데이터 동기화를 지원하며 클라이언트에서 액세스할
firebase.google.com