Read write data
데이터 읽기
원격 데이터를 읽기 위해서는 addDocumentListener()
를 통해 DocumentListener
를 등록해야 합니다.
Listener | 이벤트 콜백 | 용도 |
---|---|---|
DocumentListener | onDocumentChanged() | 데이터가 변경되었을 때 처리 |
onDocumentError() | 데이터 동기화 에러가 발생되었을 때 처리 |
onDocumentChanged()
콜백 메소드를 통해 이벤트 발생 시점에, 최신 데이터를 읽을 수 있습니다. 이벤트 콜백 함수는 하위 노드의 데이터까지 포함하여 데이터를 전달하며, 존재하지 않는 document일 경우 빈 문서가 전달됩니다.
너무 많은 listener를 등록할 경우, 성능 이슈가 발생될 수도 있습니다.
다음 코드는 사용자 프로필 정보가 변경될 때마다 데이터를 읽는 예입니다.
- Kotlin
- Java
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
}
})
appDoc.addDocumentListener(new DocumentListener() {
@Override
public void onDocumentChanged(@NonNull SyncDocument document, boolean fromRemote) {
Optional<FullUserProfile> fullProfile = Optional.ofNullable(document.value(FullUserProfile.class));
Log.d(TAG, String.format("User profile :", fullProfile));
}
@Override
public void onDocumentError(@NonNull SyncDocument document, @NonNull SyncError e) {
// TODO: Handle data sync error
}
})
Document 노드 탐색
Root document에서 하위 노드를 접근하기 위해서는 child()
메소드를 사용할 수 있습니다.
노드 유형이 리스트라면, 배열 인덱스로 리스트 노드의 하위 노드를 가져올 수 있습니다.
- Kotlin
- Java
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.
SyncDocument companyDoc = appDoc.child("company");
SyncDocument wantedDoc = companyDoc.child("wanted");
SyncDocument frontEndDoc = wantedDoc.child("0");
SyncDocument backEndDoc = wantedDoc.child("1");
SyncDocument notExistDoc = wantedDoc.child("2"); // This document does not exist, so its value is null.
또는 paths()
메소드로 하위 노드를 한번에 탐색할 수 있습니다.
- Kotlin
- Java
val sameFrontEndDoc = appDoc?.paths("company", "wanted", "0") // This document is equal to frontEndDoc.
SyncDocument sameFrontEndDoc = appDoc.paths("company", "wanted", "0"); // This document is equal to frontEndDoc.
데이터 쓰기
항목 추가
setKeyValue()
메소드에 필드 값과 필드명을 매개변수로 전달하여 document 데이터를 저장합니다.
아래는 간단한 회원을 추가하는 코드입니다.
{
"name": "pleos",
"since": 2025,
"members": [
{
"name": "normal",
"age": 20,
"level": 1
},
{
"name": "vip",
"age": 40,
"level": 5
}
]
}
- Kotlin
- Java
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")
public class User {
public String name;
public int age;
public int level;
public User(String name, int age, int level) {
this.name = name;
this.age = age;
this.level = level;
}
}
public class Mall {
public String name;
public List<User> members;
public List<User> blackList;
}
SyncDocument memberDoc = mallDoc.child("members");
User newCustomer = new User("Stranger", 30, 0);
memberDoc.setKeyValue(newCustomer, "2");
위 예에서는 member 노드를 탐색 후 새로운 사용자를 추가하였습니다. 조금 더 간단하게 추가하려면 다음과 같이 작성해도 무방합니다.
- Kotlin
- Java
//Set an object from root node with paths.
mallDoc?.setKeyValue(newCustomer, "members.2")
//You can append an object explicitly.
membersDoc?.appendToArray(newCustomer)
//Set an object from root node with paths.
mallDoc.setKeyValue(newCustomer, "members.2");
//You can append an object explicitly.
membersDoc.appendToArray(newCustomer);
아래는 vip 회원 이전에 새로운 회원을 추가하려는 코드입니다.
- Kotlin
- Java
membersDoc?.insertToArray(1, newCustomer)
membersDoc.insertToArray(1, newCustomer);
setKeyValue
는 주어진 값으로 설정하기 때문에 새로운 객체를 배열의 특정 위치에 추가하려면 insertToArray
메소드를 사용하 세요.
setKeyValue
메소드로 mallDoc
Object 노드에 새로운 blackList 필드를 추가해봅시다.
{
"name": "pleos",
"since": 2025,
"members": [
{
"name": "normal",
"age": 20,
"level": 1
},
{
"name": "vip",
"age": 40,
"level": 5
}
],
"blackList": [
{
"name": "bad",
"age": 12,
"level": 0
}
]
}
- Kotlin
- Java
mallDoc?.setKeyValue(listOf(User("bad", 12, 0)), "blackList")
mallDoc.setKeyValue(Arrays.asList(new User("bad", 12, 0)), "blackList");
항목 업데이트
setKeyValue()
메소드로 간단하게 새로운 값을 업데이트할 수 있습니다.
아래는 쇼핑몰 설립일을 2021년으로, normal 회원의 나이를 21로 변경하는 코드입니다.
- Kotlin
- Java
mallDoc?.setKeyValue(2021, "since")
mallDoc?.setKeyValue(21, "members.0.age")
mallDoc.setKeyValue(2021, "since");
mallDoc.setKeyValue(21, "members.0.age");
항목 삭제
unsetKeyValue()
에 삭제하고자 하는 경로를 입력하면, 필드 데이터를 삭제할 수 있습니다.
아래는 새로 추가한 회원과 새로운 필드값을 삭제하는 코드입니다.
- Kotlin
- Java
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)
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);