[android] firebase realtime database를 이용하여 데이터 저장

Pyo·2024년 7월 1일
0

realtime database

Firebase는 두 가지 주요 데이터베이스 옵션을 제공하는데 Realtime Database와 Cloud Firestore가 있다. 그중 Realtime Database는 Google의 클라우드 기반 NoSQL 데이터베이스로, 실시간 데이터 동기화를 제공하는 서비스로 Firebase Realtime Database는 간단한 데이터 구조와 실시간 동기화가 필요한 소규모 애플리케이션에 적합하다.

realtime database를 이용하여 구현해볼 내용

realtime database를 이용하여 로그인한 계정에 recyclerView로 item(dataModel)들로 화면을 구성해보고, Dialog를 이용하여 실시간으로 data를 저장하고 recylerView로 realtime database의 데이터들을 불러 올 예정이다.

사용방법

1. realtime database 시작하기

2. 테스트 모드로 시작

3. 라이브러리 추가

데이터 저장


realtime database에 데이터를 저장하는 코드이다. dialog에서 입력한 title과 content를 DataModel 데이터 타입으로 저장하여 database의 data reference 아래에 로그인한 user의 uid값 아래로 데이터를 저장한다.

데이터는 이런식으로 저장이 된다.

데이터 읽기


realtime database에 데이터를 읽어오는 코드이다. onDataChange함수를 통해 로그인한 user의 uid 아래의 데이터를 읽어오게 되고 읽어온 데이터를 DataModel로 저장하여 dataModelList에 넣어준다. 이때, rvAdapter의 dataModeList는 realtime database에서 데이터를 읽어오기 전 상태를 유지하고 있기 때문에, notifyDataSetChanged()를 통하여 데이터 동기화를 해주어야 한다.

코드

realtime database를 이용하여 데이터를 저장하고, 읽어와서 Adapter에 넣어주는 부분의 코드이다. recyclerView에 대해 정리하는 내용은 아니기 때문에 이부분은 생략하였다.


class MyDatasActivity : AppCompatActivity() {

    private lateinit var database : FirebaseDatabase
    private lateinit var auth: FirebaseAuth


    lateinit var rvAdapter: DataRVAdapter
    val dataModelList  = mutableListOf<DataModel>()

    val TAG = MyDatasActivity::class.java.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my_datas)
        database = Firebase.database
        auth = FirebaseAuth.getInstance()

        findViewById<Button>(R.id.addDataBtn).setOnClickListener{
            showDialog()
        }

        val rv : RecyclerView = findViewById(R.id.rv_data)
        rvAdapter = DataRVAdapter(dataModelList,this)

        rv.adapter = rvAdapter
        rv.layoutManager = LinearLayoutManager(this)

        getMyData()
    }

    private fun getMyData(){
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                dataModelList.clear()
              for(data in dataSnapshot.children){
                  val dataModel = data.getValue(DataModel::class.java)
                  dataModelList.add(dataModel!!)
              }

                rvAdapter.notifyDataSetChanged()
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        database.getReference("data").child(auth.currentUser?.uid.toString()).addValueEventListener(postListener)
    }

    private fun showDialog() {
        val builder = AlertDialog.Builder(this)
        builder.setTitle("Input data")

        val layout = LinearLayout(this)
        layout.orientation = LinearLayout.VERTICAL
        layout.setPadding(16, 16, 16, 16)

        val titleInputArea = EditText(this)
        titleInputArea.hint = "Enter Title"

        val contentInputArea = EditText(this)
        contentInputArea.hint = "Enter Content"

        layout.addView(titleInputArea)
        layout.addView(contentInputArea)
        builder.setView(layout)

        builder.setPositiveButton("확인") { dialog, which ->
            val title = titleInputArea.text.toString()
            val content = contentInputArea.text.toString()

            val dataModel = DataModel("",title,content)

            database.getReference("data").child(auth.currentUser?.uid.toString()).push().setValue(dataModel)

            Toast.makeText(this,"${dataModel.title} 데이터 저장 성공",Toast.LENGTH_SHORT).show()
        }

        builder.setNegativeButton("취소") { dialog, which ->
            dialog.cancel()
        }


        builder.show()
    }
}

실행 결과

0개의 댓글

관련 채용 정보