Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Servlet
- QueryDSL
- Exception
- JPQL
- SpringBoot
- 그리디
- java
- db
- jpa
- kotlin
- 스프링 핵심 기능
- transaction
- Greedy
- Spring Boot
- http
- 자바
- JDBC
- 알고리즘
- pointcut
- 인프런
- 김영한
- spring
- Proxy
- Thymeleaf
- 스프링
- AOP
- 백준
- springdatajpa
- Android
- 스프링 핵심 원리
Archives
- Today
- Total
개발자되기 프로젝트
[Firebase] RealTime Database 본문
1. dependency 추가(모듈 수준)
implementation 'com.google.firebase:firebase-database-ktx'
2. 예시
//저장
val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn)
saveBtn?.setOnClickListener {
val healthMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString()
val database = Firebase.database
//여기에 data 담기, 현재 user의 uid 추가 가능.
val myRef = database.getReference("myMemo").child(Firebase.auth.currentUser!! .uid)
val model = DataModel(dateText, healthMemo)
//객체도 가능
myRef.push().setValue(model)
//dialog 끄기
mAlertDialog.dismiss()
}
setValue는 data가 동일할 시 database에 중복하여 저장하지 않음
만약 중복에 상관없이 추가하고 싶으면 myRef.push().setValue() 사용
객체도 저장이 가능하다.
추가로 현재 user의 uid를 child에 추가 가능하다.
이를 활용하여 data를 불러올 때 현재 user의 uid에 해당하는 data만 불러올 수 있다.
3. Data 불러오기
// Read from the database
myRef.child(Firebase.auth.currentUser!!.uid).addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
dataModelList.clear()
// This method is called once with the initial value and again
// whenever data at this location is updated.
//모든 데이터를 하나하나 dataModelList에 넣음.
for(dataModel in dataSnapshot.children){
Log.d("Data", dataModel.toString())
dataModelList.add(dataModel.getValue(DataModel::class.java)!!)
}
//list View update, FireBaes가 비동기 처리이므로 database에서 불러온 후 업데이트 필요.
adapter_list.notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException())
}
})
snapshot에 전체 데이터 들어있음
또한 비동기로 dataBase에서 읽어오기 때문에, 필요시 listView의 adapter에 업데이트 요청 필요.
또한 현재 user의 uid에 해당하는 data만 불러올 수 있다.
4. 전체 예시
package com.example.diet_memo
import android.app.DatePickerDialog
import android.content.ContentValues.TAG
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.widget.*
import androidx.appcompat.app.AlertDialog
import com.google.firebase.auth.ktx.auth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.database.ktx.database
import com.google.firebase.database.ktx.getValue
import com.google.firebase.ktx.Firebase
import java.util.*
class MainActivity : AppCompatActivity() {
val dataModelList = mutableListOf<DataModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val database = Firebase.database
val myRef = database.getReference("myMemo")
val listView = findViewById<ListView>(R.id.mainLV)
val adapter_list = ListViewAdapter(dataModelList)
listView.adapter = adapter_list
// Read from the database
myRef.child(Firebase.auth.currentUser!!.uid).addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
dataModelList.clear()
// This method is called once with the initial value and again
// whenever data at this location is updated.
//모든 데이터를 하나하나 dataModelList에 넣음.
for(dataModel in dataSnapshot.children){
Log.d("Data", dataModel.toString())
dataModelList.add(dataModel.getValue(DataModel::class.java)!!)
}
//list View update, FireBaes가 비동기 처리이므로 database에서 불러온 후 업데이트 필요.
adapter_list.notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException())
}
})
val writeBtn = findViewById<ImageView>(R.id.wireBtn)
writeBtn.setOnClickListener {
val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null)
val mBuilder = AlertDialog.Builder(this)
.setView(mDialogView)
.setTitle("운동 메모 dialog")
val mAlertDialog = mBuilder.show()
val dateSelectBtn = mAlertDialog.findViewById<Button>(R.id.dateSelectBtn)
var dateText = ""
//날짜 선택하는 dialog
dateSelectBtn?.setOnClickListener {
val today = GregorianCalendar()
val year: Int = today.get(Calendar.YEAR)
val month: Int = today.get(Calendar.MONTH)
val date: Int = today.get(Calendar.DATE)
val dlg = DatePickerDialog(this, object: DatePickerDialog.OnDateSetListener{
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
//month는 +1
Log.d("MAIN", "${year} / ${month+1} / ${dayOfMonth}")
dateSelectBtn.setText("${year} / ${month+1} / ${dayOfMonth}")
dateText = "${year} / ${month+1} / ${dayOfMonth}"
}
}, year, month, date)
dlg.show()
}
//저장
val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn)
saveBtn?.setOnClickListener {
val healthMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString()
val database = Firebase.database
//여기에 data 담기, 현재 user의 uid 추가 가능.
val myRef = database.getReference("myMemo").child(Firebase.auth.currentUser!! .uid)
val model = DataModel(dateText, healthMemo)
//객체도 가능
myRef.push().setValue(model)
//dialog 끄기
mAlertDialog.dismiss()
}
}
}
}
'인프런 > [인프런] 앱 8개를 만들면서 배우는 안드로이드 코틀린' 카테고리의 다른 글
[Android] WebView, Glide, RecyclierView onclickListener (0) | 2022.03.24 |
---|---|
[Android] Dialog띄우기 (0) | 2022.03.22 |
[Firebase] 이메일/비밀번호 로그인 (0) | 2022.03.22 |
[Firebae] Firebase 사용하기, 익명 로그인 (0) | 2022.03.22 |
[Android] Fragment, Navigation (0) | 2022.03.20 |
Comments