본문 바로가기

안드로이드

[Kotlin] 안드로이드와 실시간 데이터베이스 데이터 읽고 쓰기

728x90

toy9910.tistory.com/29

 

[Kotlin] 안드로이드와 파이어베이스 실시간 데이터베이스 연동

우선 안드로이드와 파이어베이스가 연동이 되어있다는 가정 하에 진행한다. 만약 아직 연동이 안되어 있다면 toy9910.tistory.com/28 [Kotlin] 안드로이드와 파이어베이스 연동 우선 파이어베이스의 콘

toy9910.tistory.com

위 게시물에서 연동한 실시간 데이터베이스의 데이터를 안드로이드에서 실시간으로 확인하고자 한다.

 

우선 'AndroidManifest.xml'에 INTERNET 퍼미션을 추가한다.

 

데이터베이스에 올릴 데이터의 클래스를 생성한다.

 

데이터를 담을 레이아웃 파일을 만들어 준다.

 

데이터들이 저장된 리스트를 담을 어댑터를 만든다.

initDatabase 함수를 통해 파이어베이스 인스턴스를 생성하고 버튼을 클릭하면 해당 인스턴스에 데이터를 삽입하도록 구현했다.

 

해당 인스턴스에 addValueEventListener를 사용하여 데이터가 변경될 때마다 데이터베이스 내의 데이터들을 가져와서 업데이트하도록 했다.

 

성공적으로 실행되는 것을 볼 수 있다.

 

MainActivity

더보기

package com.example.fbtest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.database.*
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
lateinit var firebaseDatabase: FirebaseDatabase
lateinit var databaseReference: DatabaseReference
lateinit var mArrayList : ArrayList<PersonData>
lateinit var mAdapter: PersonAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

mArrayList = arrayListOf<PersonData>()
mAdapter = PersonAdapter(mArrayList)

person_list.layoutManager = LinearLayoutManager(this)
person_list.adapter = mAdapter
person_list.addItemDecoration(
DividerItemDecoration(applicationContext,
LinearLayoutManager(this).orientation)
)

mArrayList.clear()
mAdapter.notifyDataSetChanged()

initDatabase()

btn_send.setOnClickListener {
val name = et_name.text.toString()
val phone = et_phone.text.toString()

// 데이터베이스에 데이터 삽입
val databaseReference1 = firebaseDatabase.getReference("person")
databaseReference1.child(name).setValue(phone)

et_name.setText("")
et_phone.setText("")
}

databaseReference.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
mArrayList.clear()
for(shot in snapshot.children) {
val data = shot.key
val data2 = shot.value.toString()
val p_name = data
val p_phone = data2
val p = PersonData(p_name, p_phone)
mArrayList.add(p)
}
mAdapter.notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
})
}

fun initDatabase() {
// 파이어베이스 인스턴스 생성
firebaseDatabase = FirebaseDatabase.getInstance()
databaseReference = firebaseDatabase.getReference("person")
}
}

PersonAdapter.kt

더보기

package com.example.fbtest

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.person_list.view.*

class PersonAdapter (list: ArrayList<PersonData>) : RecyclerView.Adapter<CustomViewHolder>() {
var mList : ArrayList<PersonData> = list

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.person_list,parent,false)
return CustomViewHolder(view)
}

override fun getItemCount(): Int {
return mList.size
}

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val p = mList.get(position)
holder.setHolder(p)
}

}

class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun setHolder(personData: PersonData) {
itemView.tv_name.text = personData.name
itemView.tv_phone.text = personData.phone
}
}

변수들을 findViewById 없이 사용하는 것은

앱 수준의 'Build.gradle' 파일에 plugins에 id 'kotlin-android-extensions' 라고 추가한 후 Sync Now 해주면 된다.

728x90
반응형