รับการอ้างอิงฐานข้อมูล
หากต้องการอ่านหรือเขียนข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ของ
DatabaseReference
DatabaseReference ref = FirebaseDatabase.instance.ref();
การอ่านและการเขียนรายการ
ต่อท้ายรายการข้อมูล
ใช้เมธอด push() เพื่อผนวกข้อมูลลงในรายการในแอปพลิเคชันแบบหลายผู้ใช้
เมธอด push() จะสร้างคีย์ที่ไม่ซ้ำกันทุกครั้งที่มีการเพิ่มบุตรหลานใหม่ลงใน
การอ้างอิง Firebase ที่ระบุ การใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้สำหรับแต่ละ
องค์ประกอบใหม่ในรายการ จะช่วยให้ไคลเอ็นต์หลายรายเพิ่มบุตรหลานไปยังสถานที่เดียวกัน
พร้อมกันได้โดยไม่มีข้อขัดแย้งในการเขียน คีย์ที่ไม่ซ้ำกันซึ่งสร้างโดย push()
จะอิงตามการประทับเวลา ดังนั้นระบบจะจัดเรียงรายการ
ตามลำดับเวลาโดยอัตโนมัติ
คุณสามารถใช้การอ้างอิงไปยังข้อมูลใหม่ที่เมธอด push() ส่งคืนเพื่อรับ
ค่าของคีย์ที่สร้างขึ้นโดยอัตโนมัติของโหนดย่อยหรือตั้งค่าข้อมูลสำหรับโหนดย่อย พร็อพเพอร์ตี้
.key ของข้อมูลอ้างอิง push() มีคีย์ที่สร้างขึ้นโดยอัตโนมัติ
คุณสามารถใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้เพื่อลดความซับซ้อนในการแปลงโครงสร้างข้อมูลเป็นรูปแบบแบน ดูข้อมูลเพิ่มเติมได้ที่ตัวอย่างแฟนเอาต์ (Fan-Out) ของข้อมูล
ตัวอย่างเช่น push() อาจใช้เพื่อเพิ่มโพสต์ใหม่ลงในรายการโพสต์
ในแอปพลิเคชันโซเชียลได้ดังนี้
DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
// ...
});
ฟังเหตุการณ์ย่อย
ระบบจะทริกเกอร์เหตุการณ์ของ Child เพื่อตอบสนองต่อการดำเนินการที่เฉพาะเจาะจงซึ่งเกิดขึ้นกับ
Child ของโหนดจากการดำเนินการ เช่น การเพิ่ม Child ใหม่ผ่านเมธอด push() หรือการอัปเดต Child ผ่านเมธอด update()
| เหตุการณ์ | การใช้งานทั่วไป |
|---|---|
onChildAdded |
ดึงข้อมูลรายการหรือฟังการเพิ่มรายการลงในลิสต์ ระบบจะทริกเกอร์เหตุการณ์นี้ 1 ครั้งสำหรับบุตรหลานที่มีอยู่แต่ละคน แล้วทริกเกอร์อีกครั้ง ทุกครั้งที่มีการเพิ่มบุตรหลานใหม่ไปยังเส้นทางที่ระบุ ระบบจะส่งสแนปชอตที่มีข้อมูลของโหนดใหม่ไปยัง Listener |
onChildChanged |
ฟังการเปลี่ยนแปลงของรายการในลิสต์ ระบบจะทริกเกอร์เหตุการณ์นี้ทุกครั้งที่มีการแก้ไขโหนดลูก ซึ่งรวมถึง การแก้ไขใดๆ ในลูกหลานของโหนดลูก สแนปชอตที่ส่งไปยัง Listener เหตุการณ์ มีข้อมูลที่อัปเดตแล้วสำหรับบุตรหลาน |
onChildRemoved |
ฟังรายการที่ถูกนำออกจากลิสต์ เหตุการณ์นี้จะทริกเกอร์เมื่อมีการนำองค์ประกอบย่อยที่อยู่ติดกันออก สแนปชอตที่ส่งไปยังบล็อกการเรียกกลับจะมีข้อมูลขององค์ประกอบย่อยที่นำออก |
onChildMoved |
ฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่เรียงลำดับ เหตุการณ์ onChildMoved จะเกิดขึ้นตามหลังเหตุการณ์ onChildChanged เสมอ ซึ่งเป็นเหตุการณ์ที่ทำให้ลำดับของรายการ เปลี่ยนแปลง (อิงตามวิธีการจัดเรียงปัจจุบัน) |
ซึ่งแต่ละรายการนี้จะช่วยให้คุณรับฟังการเปลี่ยนแปลงของโหนดที่เฉพาะเจาะจงในฐานข้อมูลได้ ตัวอย่างเช่น แอปบล็อกโซเชียลอาจใช้วิธีการเหล่านี้ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของโพสต์ ดังที่แสดงด้านล่าง
final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
// A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
// A comment has changed; use the key to determine if we are displaying this
// comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
// A comment has been removed; use the key to determine if we are displaying
// this comment and if so remove it.
});
ฟังเหตุการณ์ค่า
แม้ว่าการรอรับเหตุการณ์ย่อยจะเป็นวิธีที่แนะนําในการอ่านรายการข้อมูล แต่ก็มีบางกรณีที่การรอรับเหตุการณ์ค่าในข้อมูลอ้างอิงรายการมีประโยชน์
การแนบvalue Listener ไปยังรายการข้อมูลจะแสดงรายการข้อมูลทั้งหมดเป็นสแนปชอตเดียว ซึ่งคุณสามารถวนซ้ำเพื่อเข้าถึงรายการย่อยแต่ละรายการได้
แม้ว่าจะมีรายการที่ตรงกับคำค้นหาเพียงรายการเดียว แต่สแนปชอตก็ยังคงเป็นรายการ เพียงแต่มีรายการเดียวเท่านั้น หากต้องการเข้าถึงรายการ คุณต้องวนซ้ำ ในผลลัพธ์
myTopPostsQuery.onValue.listen((event) {
for (final child in event.snapshot.children) {
// Handle the post.
}
}, onError: (error) {
// Error.
});
รูปแบบนี้มีประโยชน์เมื่อคุณต้องการดึงข้อมูลรายการย่อยทั้งหมดของรายการ ในการดำเนินการครั้งเดียว แทนที่จะรอเหตุการณ์การเพิ่มรายการย่อยเพิ่มเติม
การจัดเรียงและการกรองข้อมูล
คุณใช้คลาส Query เพื่อดึงข้อมูลที่จัดเรียงตามคีย์ ตามค่า หรือตามค่าขององค์ประกอบย่อยได้ นอกจากนี้ คุณยังกรอง
ผลลัพธ์ที่จัดเรียงให้เหลือจำนวนผลลัพธ์ที่เฉพาะเจาะจงหรือช่วงของคีย์หรือ
ค่าได้ด้วย
จัดเรียงข้อมูล
หากต้องการดึงข้อมูลที่จัดเรียงแล้ว ให้เริ่มด้วยการระบุเมธอด order-by อย่างใดอย่างหนึ่งเพื่อ กำหนดวิธีจัดเรียงผลลัพธ์
| วิธีการ | การใช้งาน |
|---|---|
orderByChild() |
จัดเรียงผลลัพธ์ตามค่าของคีย์ย่อยที่ระบุหรือเส้นทางย่อยที่ซ้อนกัน |
orderByKey() |
จัดเรียงผลลัพธ์ตามคีย์ย่อย |
orderByValue() |
จัดเรียงผลลัพธ์ตามค่าของรายการย่อย |
คุณใช้วิธีการจัดเรียงได้วิธีเดียวในแต่ละครั้ง การเรียกใช้เมธอด order-by หลายครั้งในคำค้นหาเดียวกันจะทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงวิธีดึงรายการโพสต์ยอดนิยมของผู้ใช้ ที่จัดเรียงตามจำนวนดาว
final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
.ref("user-posts/$myUserId")
.orderByChild("starCount");
ซึ่งจะกำหนดคําค้นหาที่เมื่อรวมกับเครื่องมือฟังย่อย จะซิงค์ไคลเอ็นต์กับโพสต์ของผู้ใช้จากเส้นทางในฐานข้อมูล ตามรหัสผู้ใช้ โดยเรียงตามจํานวนดาวที่แต่ละโพสต์ได้รับ เทคนิคการใช้รหัสเป็นคีย์ดัชนีนี้เรียกว่าการกระจายข้อมูล คุณสามารถอ่านข้อมูลเพิ่มเติมได้ในจัดโครงสร้างฐานข้อมูล
การเรียกใช้เมธอด orderByChild() จะระบุคีย์ย่อยเพื่อจัดเรียง
ผลลัพธ์ ในกรณีนี้ ระบบจะจัดเรียงโพสต์ตามค่าขององค์ประกอบย่อย "starCount" ที่เกี่ยวข้อง นอกจากนี้ คุณยังจัดเรียงการค้นหาตามรายการย่อยที่ซ้อนกันได้ด้วย ในกรณีที่มีข้อมูลลักษณะดังนี้
"posts": {
"ts-functions": {
"metrics": {
"views" : 1200000,
"likes" : 251000,
"shares": 1200,
},
"title" : "Why you should use TypeScript for writing Cloud Functions",
"author": "Doug",
},
"android-arch-3": {
"metrics": {
"views" : 900000,
"likes" : 117000,
"shares": 144,
},
"title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
"author": "Doug",
}
},
ในกรณีนี้ เราสามารถจัดเรียงองค์ประกอบของรายการตามค่าที่ซ้อนอยู่ใต้คีย์ metrics ได้โดยการระบุเส้นทางที่เกี่ยวข้องไปยังองค์ประกอบย่อยที่ซ้อนอยู่ในการเรียก orderByChild()
final mostViewedPosts =
FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดเรียงประเภทข้อมูลอื่นๆ ได้ที่วิธีจัดเรียงข้อมูลการค้นหา
การกรองข้อมูล
หากต้องการกรองข้อมูล คุณสามารถรวมวิธีการจำกัดหรือช่วงใดก็ได้กับวิธีการ จัดเรียงตามเมื่อสร้างคําค้นหา
| วิธีการ | การใช้งาน |
|---|---|
limitToFirst() |
กำหนดจำนวนสูงสุดของรายการที่จะแสดงจากจุดเริ่มต้นของ รายการผลการค้นหาที่เรียงลำดับ |
limitToLast() |
กำหนดจำนวนสูงสุดของรายการที่จะแสดงจากท้ายรายการผลการค้นหาที่เรียงลำดับแล้ว |
startAt() |
แสดงรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
startAfter() |
แสดงรายการที่มากกว่าคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
endAt() |
แสดงรายการที่มีคีย์หรือค่าที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
endBefore() |
แสดงรายการที่มีค่าน้อยกว่าคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
equalTo() |
แสดงรายการที่เท่ากับคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับ วิธีการจัดเรียงที่เลือก |
คุณรวมฟังก์ชัน limit หรือ range หลายรายการได้ ซึ่งต่างจากเมธอด order-by
เช่น คุณสามารถรวมเมธอด startAt() และ endAt() เพื่อจำกัดผลลัพธ์ให้อยู่ในช่วงค่าที่ระบุได้
จำกัดจำนวนผลลัพธ์
คุณสามารถใช้วิธี limitToFirst() และ limitToLast() เพื่อตั้งค่า
จำนวนบุตรหลานสูงสุดที่จะซิงค์สำหรับกิจกรรมหนึ่งๆ เช่น หากคุณใช้ limitToFirst() เพื่อตั้งค่าขีดจํากัดเป็น 100 ในตอนแรก คุณจะได้รับเหตุการณ์ onChildAdded สูงสุด 100 รายการเท่านั้น
หากคุณมีสินค้าที่จัดเก็บไว้ในฐานข้อมูล Firebase น้อยกว่า 100 รายการ ระบบจะทริกเกอร์เหตุการณ์ onChildAdded สำหรับสินค้าแต่ละรายการ
เมื่อมีการเปลี่ยนแปลงรายการ คุณจะได้รับเหตุการณ์ onChildAdded สำหรับรายการที่เข้าสู่คำค้นหา และเหตุการณ์ onChildRemoved สำหรับรายการที่ออกจากคำค้นหา เพื่อให้จำนวนรวมยังคงอยู่ที่ 100
ตัวอย่างต่อไปนี้แสดงวิธีที่แอปบล็อกตัวอย่างกำหนดการค้นหาเพื่อ ดึงรายการโพสต์ล่าสุด 100 รายการจากผู้ใช้ทั้งหมด
final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);
ตัวอย่างนี้กำหนดเฉพาะการค้นหาเท่านั้น หากต้องการซิงค์ข้อมูลจริง จะต้องมีListener ที่แนบมา
กรองตามคีย์หรือค่า
คุณใช้ startAt(), startAfter(), endAt(), endBefore() และ equalTo() เพื่อเลือกจุดเริ่มต้น จุดสิ้นสุด และจุดเทียบเท่าที่กำหนดเองสำหรับคำค้นหาได้
ซึ่งอาจมีประโยชน์ในการแบ่งหน้าข้อมูลหรือค้นหารายการที่มีรายการย่อย
ซึ่งมีค่าที่เฉพาะเจาะจง
วิธีกำหนดลำดับข้อมูลการค้นหา
ส่วนนี้จะอธิบายวิธีจัดเรียงข้อมูลตามวิธีการจัดเรียงแต่ละวิธีในคลาส
Query
orderByChild
เมื่อใช้ orderByChild() ข้อมูลที่มีคีย์ย่อยที่ระบุจะ
จัดเรียงดังนี้
- เด็กที่มีค่า
nullสำหรับคีย์ของเด็กที่ระบุจะแสดงก่อน - จากนั้นจะเป็นเด็กที่มีค่า
falseสำหรับคีย์ย่อยที่ระบุ หากมีบุตรหลายคนที่มีค่าเป็นfalseระบบจะ จัดเรียงตามพจนานุกรมตามคีย์ - จากนั้นจะเป็นเด็กที่มีค่า
trueสำหรับคีย์ย่อยที่ระบุ หากมีหลายรายการที่มีค่าเป็นtrueระบบจะจัดเรียงตามพจนานุกรมตามคีย์ - จากนั้นจะเป็นชื่อที่มีค่าตัวเลขเรียงจากน้อยไปมาก หาก โหนดย่อยหลายรายการมีค่าตัวเลขเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงโหนดย่อยตามคีย์
- สตริงจะอยู่หลังตัวเลขและจัดเรียงตามลำดับตัวอักษรจากน้อยไปมาก หากโหนดย่อยหลายรายการมีค่าเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามพจนานุกรมตามคีย์
- ออบเจ็กต์จะอยู่สุดท้ายและจัดเรียงตามพจนานุกรมตามคีย์จากน้อยไปมาก
orderByKey
เมื่อใช้ orderByKey() เพื่อจัดเรียงข้อมูล ระบบจะแสดงข้อมูลตามลำดับจากน้อยไปมาก
ตามคีย์
- เด็กที่มีคีย์ที่แยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตได้จะแสดงก่อน โดยเรียงตามลำดับจากน้อยไปมาก
- จากนั้นจะเป็นเด็กที่มีค่าสตริงเป็นคีย์ โดยจะจัดเรียงตามลำดับแบบพจนานุกรมจากน้อยไปมาก
orderByValue
เมื่อใช้ orderByValue() ระบบจะจัดเรียงเด็กตามมูลค่า เกณฑ์การจัดเรียงจะเหมือนกับใน orderByChild() ยกเว้นว่าจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ
ยกเลิกการเชื่อมต่อ Listener
ระบบจะนำการเรียกกลับออกโดยการเรียกใช้เมธอด off() ในการอ้างอิงฐานข้อมูล Firebase
คุณนำ Listener รายเดียวออกได้โดยส่งเป็นพารามิเตอร์ไปยัง off()
การโทร off() ในสถานที่ที่ไม่มีอาร์กิวเมนต์จะนำผู้ฟังทั้งหมดในสถานที่นั้นออก
การเรียกใช้ off() ใน Listener ของผู้ปกครองจะไม่
นำ Listener ที่ลงทะเบียนในโหนดลูกออกโดยอัตโนมัติ
ต้องเรียกใช้ off() ใน Listener ของลูกด้วย
เพื่อนำการเรียกกลับออก