출처
하울, 『Firebase로 안드로이드 SNS 앱 만들기』, 비제이퍼블릭(2018-07-31), 74-108p
Firebase 데이터베이스
- Push Driven 방식으로 데이터베이스가 주도권을 갖고 내용 수정 시 컨트롤러 호출
- RealtimeDatabase가 있는데 버리고 Firestore을 배우면 됨
1. Gradle에 firestore 추가
implementation 'com.google.firebase:firebase-firestore:18.0.1'
2. Firebase 콘솔의 Database로 들어가 Cloud Firestore 시작
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid !=null;
}
}
}
3. Firestore 선언하기
var firestore: FirebaseFirestore? = null
firestore = FirebaseFirestore.getInstance()
데이터베이스 입력하기(Create)
- 다중 클라이언트가 데이터베이스 Document에 데이터를 저장시킬 때 다중 클라이언트가 중복된 데이터를 저장하게 하는 것을 막지 못함
- 예를 들어 한 클라이언트가 페이스북에 좋아요를 여러 번 누르면 데이터베이스에는 한 번 좋아요 누른 것이 아닌 여러 번 누른 것으로 기록
- 데이터베이스는 Document에 이름을 입력하는 방식과 Document에 임의의 이름을 넣는 방식이 있음
데이터베이스 입력
입력 방식 |
사용 목적 |
Set |
기본적인 데이터 입력 |
runTransactions |
여러 클라이언트의 데이터 중복 접근 방지 |
데이터 모델 선언
data class UserDTO(var name: String? = null, var address: String? = null)
fun createData() {
var userDTO = UserDTO("부질", "없어")
firestore?.collection("User")?.document("document1")?.set(userDTO)?.addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(this, "데이터 생성 성공", Toast.LENGTH_SHORT).show()
}
}
}
Document 이름을 직접 넣는 방식
collection(Collection_name).document(Document_name).set(input_data)
.addOnCompleteListener {
task->
}
- addOnCompleteListner: 데이터베이스 입력에 대한 정상적인 결과 값 확인용
Document 이름을 임의적으로 생성하는 방식
collection(Collection_name).document().set(input_data).addOnCompleteListener {
task ->
}
fun createData2() {
var userDTO = UserDTO("진화", "한닷")
firestore?.collection("User")?.document()?.set(userDTO)?.addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(this, "데이터 생성 성공", Toast.LENGTH_SHORT).show()
}
}
}
runTransaction 방식
- 경로를 클래스로 만든 뒤에 runTransaction을 호출
- 데이터 중복을 막기 위해 사용
runTransaction {
transaction ->
var result = transaction.get(database_path).toObject(datamodel)
transaction.set(database_path, result)
}
fun runTransaction() {
var tsDoc = firestore?.collection("User")?.document(
"document1"
)
firestore?.runTransaction { transaction ->
val userDTO = transaction.get(tsDoc!!).toObject(UserDTO::class.java)
userDTO?.name - "ming"
transaction.set(tsDoc, userDTO!!)
}
}
데이터베이스 읽어오기 (Read)
Pull Driven
- 컨트롤러가 원하는 타이밍에 데이터를 읽어오는 방식
- addOnCompleteListener로 데이터를 읽어옴
collection(Collection_name).document(Document_name).get().addOnCompleteListener {
task ->
}
경로 방식 데이터 읽어오기
- 데이터의 Collection과 Document ID 경로를 알고 있을 때 사용
collection(Collection_name).document(Document_name).get().addOnCompleteListener {
task ->
}
fun readData() {
firestore?.collection("User")?.document("document1")?.get()?.addOnCompleteListener { task ->
if (task.isSuccessful) {
var userDTO = task.result.toObject(UserDTO::class.java)
println(userDTO.toString())
}
}
}
쿼리 방식 데이터 읽어오기
data class UserDTO(var name: String?=null, var address: String? = null, var age:Int? = null)
firestore?.collection("User")?.document()?.set(UserDTO("캘시퍼", "부산", 5))
firestore?.collection("User")?.document()?.set(UserDTO("마르클", "대전", 9))
firestore?.collection("User")?.document()?.set(UserDTO("마녀", "목포", 70))
ㅎㄹㅇㄱ ㅇ ㅎㄷㄱ ㅎㅅ ㅇㅎ ㅅㄱ
Comments