Android with Firebase Realtime Database - read | write | update | delete (ฉบับแปล doc)







1.) เริ่มต้นด้วยการลองเขียนข้อมูลลง Database (write)

Basic write operations - การเขียนข้อมูลแบบเบสิกๆ จะใช้ setValue()
ข้อมูลที่สามารถส่งเข้าไปจะมีทั้งแบบ
  • String
  • Long
  • Double
  • Boolean
หรือจะเก็บเป็น Map และ List
  • Map<String, Object>
  • List<Object>

ตัวอย่างการ insert ข้อมูล User profile ใหม่ (แบบใช้ Model) ..เราอาจจะออกแบบ User Object แบบนี้

@IgnoreExtraProperties
data class User(
    var username: String? = "",
    var email: String? = ""
)

แล้วนำ Object มาเขียนลง Database (วิธีนี้จะเขียนทับข้อมูลเดิมใน child ที่กำหนด)

[code]
private fun writeNewUser(userId: String, name: String, email: String?) {
    val user = User(name, email)
    database.child("users").child(userId).setValue(user)
}

หรือจะเขียนทับแค่ name ของ user แบบเจาะจง id ..อารมณ์ประมาณ update

database.child("users").child(userId).child("username").setValue(name)




2.) Read การอ่านข้อมูล

เริ่มจากการอ่านหรือดักจับการเปลี่ยนแปลงของ path ที่กำหนด
มี 2 ฟังก์ชั่นให้ใช้ addValueEventListener และ addListenerForSingleValueEvent


2.1.) addValueEventListener() 

ข้อมูลที่ส่งกลับมาใน onDataChange() เรียกว่า dataSnapshot  ถ้าไม่มีจะ return false

ตัวอย่าง : การดึงรายละเอียดของการโพสต์ จากฐานข้อมูลโดยใช้ addValueEventListener

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val post = dataSnapshot.getValue(Post::class.java)  // ตัวอย่างการดึง Post object 
        // ... นำข้อมูล post ไปอัพเดท UI ตัวอย่าง (PostDetailActivity.kt)
    }

    override fun onCancelled(databaseError: DatabaseError) {
           // เขียน Log แสดง Error เมื่อ ดึงข้อมูลไม่สำเร็จ กรณีเช่น ผู้ใช้ไม่มีสิทธิ์อ่านข้อมูลจากตำแหน่งฐานข้อมูล Firebase
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        // ...
    }
}
postReference.addValueEventListener(postListener)


2.2) addListenerForSingleValueEvent()

ทำงานครั้งเดียว ตัวอย่างเช่นการ เริ่มต้นองค์ประกอบ UI ที่คุณไม่คาดหวังว่าจะเปลี่ยนมันอีก

ตัวอย่างการประยุคใช้ (แบบคร่าวๆ)
https://trymydroid.blogspot.com/2019/08/android-firebase-realtime-database.html


3.) การ update ข้อมูล

3.1) Update specific fields

updateChildren() ใช้เมื่อต้องการเขียนไปยัง children ของ node พร้อมกัน
ตัวอย่างเช่นระบบ social  ที่มีข้อมูล Post class (model) แบบนี้


@IgnoreExtraProperties
data class Post(
    var uid: String? = "",
    var author: String? = "",
    var title: String? = "",
    var body: String? = "",
    var starCount: Int = 0,
    var stars: MutableMap<String, Boolean> = HashMap()
) {

    @Exclude
    fun toMap(): Map<String, Any?> {
        return mapOf(
                "uid" to uid,
                "author" to author,
                "title" to title,
                "body" to body,
                "starCount" to starCount,
                "stars" to stars
        )
    }
}
ตัวอย่าง การนำ model Post ด้านบน มาสร้างโพสต์และอัปเดตไปยังฟีดกิจกรรมล่าสุด
และฟีดกิจกรรมของผู้ใช้ที่โพสต์พร้อมกัน

NewPostActivity.kt

private fun writeNewPost(userId: String, username: String, title: String, body: String) {
    val key = database.child("posts").push().key
    if (key == null) {
        Log.w(TAG, "Couldn't get push key for posts")
        return
    }

    val post = Post(userId, username, title, body)
    val postValues = post.toMap()

    val childUpdates = HashMap<String, Any>()
    childUpdates["/posts/$key"] = postValues
    childUpdates["/user-posts/$userId/$key"] = postValues

    database.updateChildren(childUpdates)
}


3.2) Add a Completion Callback

ตัวอย่างฟังก์ชั่น  writeNewUser โดยมีการทำ TaskListeners เพื่อจะได้รู้ว่า success หรือ fail

fun writeNewUserWithTaskListeners(userId: String, name: String, email: String) {
        val user = User(name, email)
        database.child("users").child(userId).setValue(user)
                .addOnSuccessListener {
                    // Write was successful!
                }
                .addOnFailureListener {
                    // Write failed
                }
    }



4.) การลบข้อมูล (Delete)

ปกติจะใช้ removeValue()
หรืออาจจะใช้ setValue(null) ก็ได้
หรือจะ updateChildren() เพื่อลบหลายๆ children ใน request เพียงครั้งเดียวก็ได้เช่นกัน


ฉบับสรุปตามที่ได้ลองทำ


Ref :
https://firebase.google.com/docs/database/android/read-and-write