본문으로 건너뛰기

Read write data

데이터 읽기

원격 데이터를 읽기 위해서는 addDocumentListener()를 통해 DocumentListener를 등록해야 합니다.

Listener이벤트 콜백용도
DocumentListeneronDocumentChanged()데이터가 변경되었을 때 처리
onDocumentError()데이터 동기화 에러가 발생되었을 때 처리

onDocumentChanged() 콜백 메소드를 통해 이벤트 발생 시점에, 최신 데이터를 읽을 수 있습니다. 이벤트 콜백 함수는 하위 노드의 데이터까지 포함하여 데이터를 전달하며, 존재하지 않는 document일 경우 빈 문서가 전달됩니다.

주의

너무 많은 listener를 등록할 경우, 성능 이슈가 발생될 수도 있습니다.

다음 코드는 사용자 프로필 정보가 변경될 때마다 데이터를 읽는 예입니다.

appDoc.addDocumentListener(object : DocumentListener {
override fun onDocumentChanged(document: SyncDocument, fromRemote: Boolean) {
val fullProfile: FullUserProfile? = document.value()
println("User profile : $fullProfile")
}

override fun onDocumentError(document: SyncDocument, e: SyncError) {
// TODO: Handle data sync error
}
})

Document 노드 탐색

Root document에서 하위 노드를 접근하기 위해서는 child() 메소드를 사용할 수 있습니다. 노드 유형이 리스트라면, 배열 인덱스로 리스트 노드의 하위 노드를 가져올 수 있습니다.

val companyDoc = appDoc?.child("company")
val wantedDoc = companyDoc?.child("wanted")
val frontEndDoc = wantedDoc?.child("0")
val backEndDoc = wantedDoc?.child("1")
val notExistDoc = wantedDoc?.child("2") // This document does not exist, so its value is null.

또는 paths() 메소드로 하위 노드를 한번에 탐색할 수 있습니다.

val sameFrontEndDoc = appDoc?.paths("company", "wanted", "0") // This document is equal to frontEndDoc.

데이터 쓰기

항목 추가

setKeyValue() 메소드에 필드 값과 필드명을 매개변수로 전달하여 document 데이터를 저장합니다. 아래는 간단한 회원을 추가하는 코드입니다.

[Remote document data]
{
"name": "pleos",
"since": 2025,
"members": [
{
"name": "normal",
"age": 20,
"level": 1
},
{
"name": "vip",
"age": 40,
"level": 5
}
]
}
data class User(val name:String, val age:Int, val level:Int)
data class Mall(val name:String, val members:List<User>, val blackList:List<User>?)

val membersDoc = mallDoc?.child("members")
val newCustomer = User("Stranger", 30, 0)
membersDoc?.setKeyValue(newCustomer, "2")

위 예에서는 member 노드를 탐색 후 새로운 사용자를 추가하였습니다. 조금 더 간단하게 추가하려면 다음과 같이 작성해도 무방합니다.

//Set an object from root node with paths.
mallDoc?.setKeyValue(newCustomer, "members.2")
//You can append an object explicitly.
membersDoc?.appendToArray(newCustomer)

아래는 vip 회원 이전에 새로운 회원을 추가하려는 코드입니다.

membersDoc?.insertToArray(1, newCustomer)
주의

setKeyValue는 주어진 값으로 설정하기 때문에 새로운 객체를 배열의 특정 위치에 추가하려면 insertToArray 메소드를 사용하세요.

setKeyValue 메소드로 mallDoc Object 노드에 새로운 blackList 필드를 추가해봅시다.

[Expected data]
{
"name": "pleos",
"since": 2025,
"members": [
{
"name": "normal",
"age": 20,
"level": 1
},
{
"name": "vip",
"age": 40,
"level": 5
}
],
"blackList": [
{
"name": "bad",
"age": 12,
"level": 0
}
]
}
mallDoc?.setKeyValue(listOf(User("bad", 12, 0)), "blackList")

항목 업데이트

setKeyValue() 메소드로 간단하게 새로운 값을 업데이트할 수 있습니다. 아래는 쇼핑몰 설립일을 2021년으로, normal 회원의 나이를 21로 변경하는 코드입니다.

mallDoc?.setKeyValue(2021, "since")
mallDoc?.setKeyValue(21, "members.0.age")

항목 삭제

unsetKeyValue()에 삭제하고자 하는 경로를 입력하면, 필드 데이터를 삭제할 수 있습니다. 아래는 새로 추가한 회원과 새로운 필드값을 삭제하는 코드입니다.

mallDoc?.unsetKeyValue("since")
mallDoc?.unsetKeyValue("members.2")
//You can also delete an user from membersDoc.
membersDoc?.unsetKeyValue("2")
//Or you can delete an user using array method.
membersDoc?.deleteInArray(2, 1)