Basic write operations - การเขียนข้อมูลแบบเบสิกๆ จะใช้ setValue()
ข้อมูลที่สามารถส่งเข้าไปจะมีทั้งแบบ
- String
- Long
- Double
- Boolean
- 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) แบบนี้
ตัวอย่าง การนำ model Post ด้านบน มาสร้างโพสต์และอัปเดตไปยังฟีดกิจกรรมล่าสุด@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 ) } }
และฟีดกิจกรรมของผู้ใช้ที่โพสต์พร้อมกัน
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