เอกสารนี้ครอบคลุมข้อมูลพื้นฐานของการดึงข้อมูล รวมถึงวิธีเรียงลำดับและกรองข้อมูล ข้อมูล Firebase
ก่อนเริ่มต้น
ก่อนที่จะใช้งานได้ Realtime Database คุณต้องทำดังนี้
ลงทะเบียนโปรเจ็กต์ Unity และกำหนดค่าให้ใช้ Firebase
หากโปรเจ็กต์ Unity ของคุณใช้ Firebase อยู่แล้ว ก็หมายความว่า ลงทะเบียนและกำหนดค่าสำหรับ Firebase แล้ว
หากไม่มีโปรเจ็กต์ Unity คุณสามารถดาวน์โหลด ตัวอย่างแอป
เพิ่ม Firebase Unity SDK (โดยเฉพาะ
FirebaseDatabase.unitypackage
) ไปยัง โปรเจ็กต์ Unity
โปรดทราบว่าการเพิ่ม Firebase ลงในโปรเจ็กต์ Unity จะเกี่ยวข้องกับงานทั้งใน คอนโซล Firebase และในโปรเจ็กต์ Unity ที่เปิดอยู่ (เช่น คุณดาวน์โหลดไฟล์การกำหนดค่า Firebase จากคอนโซล แล้วย้าย ลงในโปรเจ็กต์ Unity)
กำลังดึงข้อมูล
ระบบจะดึงข้อมูล Firebase จากการเรียก GetValueAsync() แบบครั้งเดียว หรือ
แนบกับกิจกรรมในการอ้างอิง FirebaseDatabase
Listener เหตุการณ์คือ
เรียก 1 ครั้งสำหรับสถานะเริ่มต้นของข้อมูล และเรียกอีกครั้งทุกครั้งที่ข้อมูลเปลี่ยนแปลง
รับ DatabaseReference
หากต้องการอ่านข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ของ DatabaseReference
:
using Firebase; using Firebase.Database; using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread public class MyScript: MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; } }
อ่านข้อมูลครั้งเดียว
คุณสามารถใช้เมธอด GetValueAsync
เพื่ออ่านสแนปชอตแบบภาพนิ่งของ
ตามเส้นทางที่ระบุได้เพียงครั้งเดียว ผลลัพธ์ของงานจะมีสแนปชอต
ซึ่งมีข้อมูลทั้งหมดในตำแหน่งนั้น รวมทั้งข้อมูลย่อยด้วย ถ้าไม่มีข้อมูล
สแนปชอตที่แสดงผลคือ null
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .GetValueAsync().ContinueWithOnMainThread(task => { if (task.IsFaulted) { // Handle the error... } else if (task.IsCompleted) { DataSnapshot snapshot = task.Result; // Do something with snapshot... } });
ฟังเหตุการณ์
คุณสามารถเพิ่ม Listener เหตุการณ์เพื่อติดตามการเปลี่ยนแปลงของข้อมูลได้ดังนี้
เหตุการณ์ | การใช้งานทั่วไป |
---|---|
ValueChanged |
อ่านและรับฟังการเปลี่ยนแปลงเนื้อหาทั้งหมดของเส้นทาง |
ChildAdded
| ดึงข้อมูลรายการต่างๆ หรือฟังการเพิ่มในรายการ
การใช้งานที่แนะนำกับ ChildChanged และ
ChildRemoved เพื่อตรวจสอบการเปลี่ยนแปลงของรายการ |
ChildChanged |
ฟังการเปลี่ยนแปลงของรายการ ใช้กับ
ChildAdded และ ChildRemoved เพื่อตรวจสอบ
การเปลี่ยนแปลงไปยังรายการ |
ChildRemoved |
คอยฟังรายการที่ถูกนำออก ใช้กับ
ChildAdded และ ChildChanged เพื่อตรวจสอบ
การเปลี่ยนแปลงไปยังรายการ |
ChildMoved |
คอยฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่เรียงลำดับ
ChildMoved เหตุการณ์จะเป็นไปตาม
ChildChanged เหตุการณ์ที่ทำให้เกิดการสั่งซื้อรายการ
เปลี่ยนแปลง (ขึ้นอยู่กับลำดับวิธีการปัจจุบัน) |
เหตุการณ์ ValueChanged
คุณสามารถใช้เหตุการณ์ ValueChanged
เพื่อติดตามการเปลี่ยนแปลงของ
เนื้อหาตามเส้นทางที่ระบุ เหตุการณ์นี้จะทริกเกอร์ 1 ครั้งเมื่อ Listener อยู่
แนบและอีกครั้งทุกครั้งที่ข้อมูล รวมถึงเด็ก มีการเปลี่ยนแปลง Callback ของเหตุการณ์จะส่งผ่านสแนปชอตที่มีข้อมูลทั้งหมดในตำแหน่งนั้น รวมถึง
ข้อมูลย่อย หากไม่มีข้อมูล สแนปชอตที่แสดงผลคือ null
ตัวอย่างต่อไปนี้แสดงให้เห็นเกมที่ดึงข้อมูลคะแนนของลีดเดอร์บอร์ด จากฐานข้อมูล:
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
ValueChangedEventArgs
มี DataSnapshot
ซึ่งมีข้อมูลที่
ตำแหน่งที่ระบุในฐานข้อมูล ณ เวลาที่เกิดเหตุการณ์ กำลังโทรหา Value
ในสแนปชอตจะแสดง Dictionary<string, object>
ที่แสดงถึงข้อมูล
หากไม่มีข้อมูลที่อยู่ที่ตำแหน่งนั้น การเรียกใช้ Value
จะแสดงผล null
ในตัวอย่างนี้ จะมีการตรวจสอบ args.DatabaseError
ด้วยเพื่อดูว่าการอ่าน
ยกเลิกแล้ว ตัวอย่างเช่น การอ่านอาจถูกยกเลิกหากลูกค้าไม่มี
สิทธิ์ในการอ่านจากตำแหน่งฐานข้อมูล Firebase DatabaseError
จะระบุสาเหตุของความล้มเหลว
คุณสามารถยกเลิกการสมัครได้ในภายหลังโดยใช้ DatabaseReference
ที่มี
เส้นทางเดียวกัน อินสแตนซ์ DatabaseReference
รายการเป็นแบบชั่วคราวและพิจารณาได้
ในการเข้าถึงเส้นทางและคำค้นหาต่างๆ
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged. }
กิจกรรมย่อย
ระบบจะทริกเกอร์เหตุการณ์ย่อยเพื่อตอบสนองต่อการดำเนินการบางอย่างที่เกิดขึ้นกับ
ย่อยของโหนดจากการดำเนินการ เช่น รายการย่อยใหม่ที่เพิ่มผ่าน
เมธอด Push()
หรือย่อยที่ได้รับการอัปเดตผ่าน UpdateChildrenAsync()
การใช้ทั้ง 2 อย่างนี้ร่วมกันจะเป็นประโยชน์ต่อการตอบสนองต่อการเปลี่ยนแปลงของ
ในฐานข้อมูล ตัวอย่างเช่น เกมอาจใช้วิธีการเหล่านี้
ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของเซสชันเกม ตามที่ปรากฏด้านล่าง:
var ref = FirebaseDatabase.DefaultInstance .GetReference("GameSessionComments"); ref.ChildAdded += HandleChildAdded; ref.ChildChanged += HandleChildChanged; ref.ChildRemoved += HandleChildRemoved; ref.ChildMoved += HandleChildMoved; } void HandleChildAdded(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildChanged(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildRemoved(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildMoved(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
โดยปกติแล้ว เหตุการณ์ ChildAdded
จะใช้เพื่อเรียกข้อมูลรายการ
รายการในฐานข้อมูล Firebase เหตุการณ์ ChildAdded
จะเกิดเหตุการณ์ 1 ครั้ง
ย่อยแต่ละรายการที่มีอยู่ แล้วเพิ่มใหม่ทุกครั้งที่มีการเพิ่มรายการย่อยใหม่ลงใน
เส้นทางที่ระบุ Listener ส่งผ่านสแนปชอตที่มีแท็ก
เหตุการณ์ ChildChanged
จะเกิดขึ้นทุกครั้งที่มีการแก้ไขโหนดย่อย
ซึ่งรวมถึงการแก้ไขรายการสืบทอดของโหนดย่อย ใช่เลย
ซึ่งโดยทั่วไปจะใช้ร่วมกับ ChildAdded
และ ChildRemoved
เหตุการณ์เพื่อตอบสนองต่อการเปลี่ยนแปลงรายการ ภาพรวมที่ส่งไปยัง
Listener เหตุการณ์มีข้อมูลที่อัปเดตสำหรับผู้เผยแพร่โฆษณาย่อย
เหตุการณ์ ChildRemoved
จะทริกเกอร์เมื่อมีการนำบุตรหลานที่อยู่ใกล้ชิดออก
โดยทั่วไปมักจะใช้ร่วมกับ ChildAdded
และ
ChildChanged
Callback สแนปชอตที่ส่งไปยัง Callback ของเหตุการณ์ประกอบด้วย
ข้อมูลสำหรับบุตรหลานที่นำออกไปแล้ว
ระบบจะทริกเกอร์เหตุการณ์ ChildMoved
เมื่อใดก็ตามที่ ChildChanged
เกิดเหตุการณ์โดยการอัปเดตที่ทำให้เกิดการจัดเรียงรายการย่อยใหม่ ใช่เลย
ใช้กับข้อมูลที่เรียงลำดับด้วย OrderByChild
หรือ OrderByValue
การจัดเรียงและกรองข้อมูล
คุณสามารถใช้คลาส Realtime Database Query
เพื่อดึงข้อมูลที่จัดเรียงตาม
คีย์ ตามค่า หรือตามค่าของรายการย่อย และคุณยังกรอง
ผลการค้นหาที่จัดเรียงไปยังผลลัพธ์จำนวนหนึ่งๆ หรือช่วงของคีย์ หรือ
จัดเรียงข้อมูล
หากต้องการเรียกดูข้อมูลที่จัดเรียงแล้ว ให้เริ่มด้วยการระบุวิธีการเรียงลำดับตาม วิธีเรียงลำดับผลลัพธ์
วิธีการ | การใช้งาน |
---|---|
OrderByChild() |
เรียงลำดับผลลัพธ์ตามค่าของคีย์ย่อยที่ระบุ |
OrderByKey()
| เรียงลำดับผลการค้นหาตามคีย์ย่อย |
OrderByValue() |
เรียงลำดับผลลัพธ์ตามค่าย่อย |
คุณใช้วิธีสั่งซื้อได้ครั้งละ 1 วิธีเท่านั้น การเรียกใช้วิธีการสั่งซื้อ การค้นหาเดียวกันหลายครั้งทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงวิธีสมัครรับคะแนน ลีดเดอร์บอร์ดเรียงลำดับตามคะแนน
FirebaseDatabase.DefaultInstance .GetReference("Leaders").OrderByChild("score") .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
แอตทริบิวต์นี้จะกำหนดการค้นหาที่เมื่อรวมกับ Listener เหตุการณ์ที่มีการเปลี่ยนแปลงค่า ซิงค์ไคลเอ็นต์กับลีดเดอร์บอร์ดในฐานข้อมูล โดยเรียงลำดับตาม ของแต่ละรายการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการจัดโครงสร้างข้อมูลอย่างมีประสิทธิภาพใน จัดโครงสร้างฐานข้อมูล
การเรียกเมธอด OrderByChild()
จะระบุคีย์ย่อยเพื่อเรียงลำดับ
ผลลัพธ์ตาม ในกรณีนี้ ผลลัพธ์จะจัดเรียงตามค่าของ "score"
ในเด็กแต่ละคน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเรียงลำดับข้อมูลประเภทอื่นๆ
ดูวิธีเรียงลำดับข้อมูลคำค้นหา
การกรองข้อมูล
ในการกรองข้อมูล คุณสามารถรวมวิธีการจำกัดหรือช่วงเข้ากับ ตามลำดับเมื่อสร้าง Query
วิธีการ | การใช้งาน |
---|---|
LimitToFirst() |
กำหนดจำนวนรายการสูงสุดที่จะส่งคืนตั้งแต่ต้น รายการผลลัพธ์ตามลำดับ |
LimitToLast() |
กำหนดจำนวนสินค้าสูงสุดที่จะส่งคืนจากสิ้นสุดสินค้าที่สั่งซื้อ รายการผลลัพธ์ |
StartAt() |
แสดงรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้ |
EndAt() |
แสดงรายการที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้ |
EqualTo() |
แสดงรายการผลการค้นหาเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้ |
คุณสามารถรวมฟังก์ชันขีดจำกัดหรือช่วงได้หลายรายการ ซึ่งต่างจากเมธอดการเรียงลำดับ
เช่น คุณสามารถรวมเมธอด StartAt()
และ EndAt()
เข้าด้วยกันเพื่อจำกัด
ผลลัพธ์เป็นช่วงของค่าที่ระบุ
แม้ว่าข้อความค้นหาจะมีผลลัพธ์ที่ตรงกันเพียงรายการเดียว แต่สแนปชอตจะยังคง รายชื่อ จะมีแค่รายการเดียว
จำกัดจำนวนผลการค้นหา
คุณสามารถใช้เมธอด LimitToFirst()
และ LimitToLast()
เพื่อตั้งค่า
จำนวนรายการย่อยสูงสุดที่จะซิงค์สำหรับ Callback ที่กำหนด ตัวอย่างเช่น หาก
คุณใช้ LimitToFirst()
เพื่อตั้งขีดจำกัด 100 รายการ ในตอนแรกคุณจะได้รับเฉพาะ
เป็น Callback ChildAdded
100 รายการ หากมีรายการที่จัดเก็บไม่ถึง 100 รายการใน
ฐานข้อมูล Firebase Callback ChildAdded
จะเริ่มทำงานสำหรับแต่ละรายการ
เมื่อรายการมีการเปลี่ยนแปลง คุณจะได้รับ Callback ChildAdded
รายการสําหรับรายการที่เข้าสู่
ข้อความค้นหาและ Callback ChildRemoved
รายการสำหรับรายการที่ออกจากข้อความเพื่อให้
จำนวนทั้งหมดจะอยู่ที่ 100
ตัวอย่างเช่น โค้ดด้านล่างจะแสดงคะแนนสูงสุดจากลีดเดอร์บอร์ด
FirebaseDatabase.DefaultInstance .GetReference("Leaders").OrderByChild("score").LimitToLast(1) .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
กรองตามคีย์หรือค่า
คุณใช้ StartAt()
, EndAt()
และ EqualTo()
เพื่อเลือกได้ตามต้องการ
จุดเริ่ม จุดสิ้นสุด และจุดสมมูลของข้อความค้นหา ซึ่งจะเป็นประโยชน์สำหรับ
การใส่เลขหน้าให้กับข้อมูลหรือค้นหารายการที่มีเด็กที่มีค่าเฉพาะ
วิธีเรียงลำดับข้อมูลข้อความค้นหา
ส่วนนี้จะอธิบายวิธีการจัดเรียงข้อมูลตามวิธีการเรียงลำดับแต่ละวิธีใน
Query
ชั้นเรียน
OrderByChild
เมื่อใช้ OrderByChild()
ข้อมูลที่มีคีย์ย่อยที่ระบุจะเป็น
มีลำดับดังนี้
- เด็กที่มีค่า
null
สำหรับคีย์ย่อยที่ระบุมาแล้ว ก่อน - ผู้เผยแพร่โฆษณาย่อยที่มีค่าเป็น
false
สำหรับคีย์ย่อยที่ระบุ พบกันใหม่ หากเด็กหลายคนมีค่าเป็นfalse
จำนวนจะเป็น จัดเรียงพจนานุกรมตามคีย์ - ผู้เผยแพร่โฆษณาย่อยที่มีค่าเป็น
true
สำหรับคีย์ย่อยที่ระบุ พบกันใหม่ หากเด็กหลายคนมีค่าเป็นtrue
จำนวนจะเป็น จัดเรียงแบบพจนานุกรมตามคีย์ - เด็กที่มีค่าตัวเลขจะแสดงอยู่ถัดไปโดยเรียงลำดับจากน้อยไปหามาก ถ้า เด็กหลายคนมีค่าตัวเลขเหมือนกันสำหรับผู้เผยแพร่โฆษณาย่อยที่ระบุ โหนดจะจัดเรียงตามคีย์
- สตริงอยู่หลังตัวเลขและจัดเรียงแบบพจนานุกรมจากน้อยไปมาก คำสั่งซื้อ กรณีที่รายการย่อยหลายรายการมีค่าเหมือนกันสำหรับรายการย่อยที่ระบุ โหนดจะเรียงลำดับแบบพจนานุกรมตามคีย์
- ออบเจ็กต์อยู่ท้ายสุดและจัดเรียงแบบพจนานุกรมตามคีย์ในลำดับจากน้อยไปมาก
OrderByKey
เมื่อใช้ OrderByKey()
เพื่อจัดเรียงข้อมูล ระบบจะส่งข้อมูลจากน้อยไปมาก
ตามคีย์
- เด็กที่มีคีย์ซึ่งแยกวิเคราะห์ได้เป็นจำนวนเต็ม 32 บิตจะมีอยู่ก่อนแล้วโดยจัดเรียงจากน้อยไปมาก
- เด็กที่มีค่าสตริงเป็นคีย์ถัดไป ซึ่งจัดเรียงแบบพจนานุกรมจากน้อยไปมาก
OrderByValue
เมื่อใช้ OrderByValue()
ระบบจะเรียงลำดับรายการย่อยตามค่า การจัดลำดับ
เกณฑ์จะเหมือนกับใน OrderByChild()
ยกเว้นค่าของโหนดคือ
ที่ใช้แทนค่าของคีย์ย่อยที่ระบุ