Firebase는 두 가지 주요 데이터베이스 옵션을 제공하는데 Realtime Database와 Cloud Firestore가 있다. 그중 Realtime Database는 Google의 클라우드 기반 NoSQL 데이터베이스로, 실시간 데이터 동기화를 제공하는 서비스로 Firebase Realtime Database는 간단한 데이터 구조와 실시간 동기화가 필요한 소규모 애플리케이션에 적합하다.
realtime database를 이용하여 로그인한 계정에 recyclerView로 item(dataModel)들로 화면을 구성해보고, Dialog를 이용하여 실시간으로 data를 저장하고 recylerView로 realtime database의 데이터들을 불러 올 예정이다.
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()
}
}