Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[Firebase] RealTime Database 본문

인프런/[인프런] 앱 8개를 만들면서 배우는 안드로이드 코틀린

[Firebase] RealTime Database

Seung__ 2022. 3. 22. 23:49
 

Android에서 설치 및 설정  |  Firebase Documentation

Join Firebase at Google I/O 2022 live from Shoreline Amphitheatre and online May 11-12. Register now 의견 보내기 Android에서 설치 및 설정 Firebase에 앱 연결 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니

firebase.google.com

 

 

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()

            }
        }
    }
}

 

Comments