*공부한 내용을 정리하는 글입니다. 설명이 다소 부족할 수 있습니다.
참고 문서: https://firebase.google.com/docs/database/android/lists-of-data?hl=ko
1. 접근
private lateinit var databaseRef: DatabaseReference
액티비티 OnCreate() 내에 아래 코드를 써서 데이터베이스를 참조할 수 있다.
databaseRef = FirebaseDatabase.getInstance().reference
2. 데이터베이스로부터 값 가져오기
데이터베이스 내부의 값을 참조 및 가져오기 위해서 데이터베이스의 데이터스냅샷을 얻어야 한다.
데이터스냅샷은 데이터 뭉텅이? 정도의 느낌이다. 참고로 스냅샷은 사진 용어에서 비롯되었으며 한 순간을 카메라로 찍으면 그 순간의 모든 것을 담고 있게 된다. 딱 그 정도의 느낌으로 이해하면 된다.
참조한 객체에 get()을 이용하여 데이터스냅샷을 얻을 수 있다.
이 곳에 addOnSuccessListerner라는 콜백함수를 사용하여 이때 즉시 무언가를 동작하도록 만들 수 있다.
databaseRef.get().addOnSuccessListener {
// dataSnapshot이 it으로 반환됨.
val map = it.child("chat").children.iterator().next().getValue() as HashMap<String, Any>
val name = map.get("name").toString()
}
위의 코드의 부연설명을 덧붙이자면,
.child("chat") --> 데이터스냅샷의 자식데이터로 존재하는 "chat"에 접근
.children --> "chat" 데이터의 자식데이터들에게 접근
.iterator() --> 그 자식데이터들에게 iterator()를 적용. iterator는 데이터를 순회하는 그런 기법..? 같은 거다.
.next() --> 그 중 처음 자식에게 접근
.getValue() --> 그 자식이 갖고있는 데이터를 얻어온다. 형식은 HashMap 형태이다.
.get("name") --> "name"을 key로 하여 해당되는 데이터를 얻는다.
위의 get()을 이용한 데이터 가져오기 방법은 1회성이지만 리스너를 등록하여 데이터를 무한히 읽어낼 수도 있다.
addValueEventListener는 데이터베이스 내부 값이 변경될 때마다 콜백된다.
databaseRef.addValueEventListener(object:ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
//원하는 함수 실행
}
override fun onCancelled(error: DatabaseError) {
println("loadItem:onCancelled : ${error.toException()}")
}
})
3. 새 값 저장하기
아래 예시코드를 보며 이해를 해보자. 우선 해시맵 형태의 데이터베이스에 값을 저장하기 위해선 고유한 키가 있어야 한다. 그 키에 해당하는 방에 데이터를 넣는 구조기 때문이다.
.push().getKey()를 사용하면 자동적으로 새 키를 반환받을 수 있다. 자료형은 String이다. 이걸 그대로 사용해주면 된다.
키를 만든 후에는 해시맵 객체를 새로 생성한뒤 내가 데이터베이스에 추가하고 싶은 데이터를 넣어주고
(아래의 post 객체와 .toMap()에 해당하는 부분)
이렇게 postValues가 만들어졌으면 다시 childUpdates라는 해쉬맵 객체를 만들어 키를 아까 얻은 키로 경로를 지정해주고 넣어줄 값으로 postValues를 넣어준다.
업데이트를 위해 마지막에는 updateChildren(childUpdates)를 꼭 해주어야 한다.
<파이어베이스 공식문서 참고>
댓글