เอกสารนี้ครอบคลุมพื้นฐานการดึงข้อมูลและวิธีสั่งซื้อและกรองข้อมูล Firebase
ก่อนที่คุณจะเริ่มต้น
ก่อนที่คุณจะสามารถใช้ Realtime Database ได้ คุณต้อง:
ลงทะเบียนโครงการ Unity ของคุณและกำหนดค่าเพื่อใช้ Firebase
หากโปรเจ็กต์ Unity ของคุณใช้ Firebase อยู่แล้ว แสดงว่ามีการลงทะเบียนและกำหนดค่าสำหรับ Firebase แล้ว
หากคุณไม่มีโครงการ Unity คุณสามารถดาวน์โหลด แอปตัวอย่างได้
เพิ่ม Firebase Unity SDK (โดยเฉพาะ
FirebaseDatabase.unitypackage
) ในโครงการ Unity ของคุณ
โปรดทราบว่าการเพิ่ม Firebase ในโครงการ Unity ของคุณเกี่ยวข้องกับงานทั้งใน คอนโซล Firebase และในโครงการ Unity แบบเปิดของคุณ (เช่น คุณดาวน์โหลดไฟล์กำหนดค่า Firebase จากคอนโซล จากนั้นย้ายไฟล์เหล่านี้ไปยังโครงการ Unity ของคุณ)
การดึงข้อมูล
ข้อมูล Firebase ถูกเรียกโดยการเรียกใช้ GetValueAsync() เพียงครั้งเดียว หรือแนบไปกับเหตุการณ์ในการอ้างอิง FirebaseDatabase
ผู้ฟังเหตุการณ์ถูกเรียกหนึ่งครั้งสำหรับสถานะเริ่มต้นของข้อมูล และเรียกอีกครั้งทุกครั้งที่ข้อมูลเปลี่ยนแปลง
รับข้อมูลอ้างอิงฐานข้อมูล
หากต้องการอ่านข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ของ 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... } });
ฟังเหตุการณ์
คุณสามารถเพิ่มผู้ฟังเหตุการณ์เพื่อสมัครเมื่อมีการเปลี่ยนแปลงข้อมูล:
เหตุการณ์ | การใช้งานทั่วไป |
---|---|
ValueChanged | อ่านและฟังการเปลี่ยนแปลงเนื้อหาทั้งหมดของเส้นทาง |
ChildAdded | ดึงรายการของรายการหรือฟังการเพิ่มในรายการของรายการ แนะนำให้ใช้กับ ChildChanged และ ChildRemoved เพื่อตรวจสอบการเปลี่ยนแปลงในรายการ |
ChildChanged | ฟังการเปลี่ยนแปลงรายการในรายการ ใช้กับ ChildAdded และ ChildRemoved เพื่อตรวจสอบการเปลี่ยนแปลงของรายการ |
ChildRemoved | ฟังรายการที่ถูกลบออกจากรายการ ใช้กับ ChildAdded และ ChildChanged เพื่อตรวจสอบการเปลี่ยนแปลงในรายการ |
ChildMoved | รับฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่สั่งซื้อ เหตุการณ์ ChildMoved จะตามหลังเหตุการณ์ ChildChanged ที่ทำให้คำสั่งซื้อของสินค้าเปลี่ยนแปลงเสมอ (ขึ้นอยู่กับวิธีการสั่งซื้อปัจจุบันของคุณ) |
เหตุการณ์ ValueChange
คุณสามารถใช้เหตุการณ์ ValueChanged
เพื่อติดตามการเปลี่ยนแปลงเนื้อหาในเส้นทางที่กำหนด เหตุการณ์นี้ถูกเรียกใช้หนึ่งครั้งเมื่อแนบ Listener และอีกครั้งทุกครั้งที่ข้อมูล รวมถึงลูก เปลี่ยนแปลง การเรียกกลับเหตุการณ์จะถูกส่งผ่านสแนปชอตที่มีข้อมูลทั้งหมดในตำแหน่งนั้น รวมถึงข้อมูลย่อย หากไม่มีข้อมูล สแน็ปช็อตที่ส่งคืนจะเป็น 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()
แต่ละสิ่งเหล่านี้รวมกันจะมีประโยชน์สำหรับการฟังการเปลี่ยนแปลงไปยังโหนดเฉพาะในฐานข้อมูล ตัวอย่างเช่น เกมอาจใช้วิธีการเหล่านี้ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของเซสชันเกม ดังที่แสดงด้านล่าง:
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
จะเกิดขึ้นหนึ่งครั้งสำหรับแต่ละลูกที่มีอยู่ และจากนั้นอีกครั้งทุกครั้งที่มีการเพิ่มลูกใหม่ไปยังเส้นทางที่ระบุ ผู้ฟังจะถูกส่งผ่านภาพรวมที่มีข้อมูลของเด็กใหม่
เหตุการณ์ ChildChanged
จะเกิดขึ้นทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการแก้ไขใด ๆ ต่อลูกหลานของโหนดลูก โดยทั่วไปจะใช้ร่วมกับเหตุการณ์ ChildAdded
และ ChildRemoved
เพื่อตอบสนองต่อการเปลี่ยนแปลงในรายการของรายการ สแนปชอตที่ส่งไปยังผู้ฟังเหตุการณ์มีข้อมูลที่อัปเดตสำหรับเด็ก
เหตุการณ์ ChildRemoved
จะถูกเรียกใช้เมื่อลบรายการย่อยทันที โดยทั่วไปจะใช้ร่วมกับการโทรกลับ ChildAdded
และ ChildChanged
สแนปชอตที่ส่งผ่านไปยังการเรียกกลับเหตุการณ์มีข้อมูลสำหรับเด็กที่ถูกลบ
เหตุการณ์ ChildMoved
จะถูกทริกเกอร์เมื่อใดก็ตามที่เหตุการณ์ ChildChanged
ถูกยกขึ้นโดยการอัปเดตที่ทำให้เกิดการเรียงลำดับใหม่ของเด็ก ใช้กับข้อมูลที่สั่งด้วย OrderByChild
หรือ OrderByValue
การเรียงลำดับและการกรองข้อมูล
คุณสามารถใช้คลาส Realtime Database Query
เพื่อดึงข้อมูลที่จัดเรียงตามคีย์ ตามค่า หรือตามค่าของลูก คุณยังสามารถกรองผลลัพธ์ที่จัดเรียงเป็นจำนวนเฉพาะของผลลัพธ์หรือช่วงของคีย์หรือค่า
จัดเรียงข้อมูล
ในการดึงข้อมูลที่เรียงลำดับ ให้เริ่มด้วยการระบุหนึ่งในวิธีการเรียงลำดับเพื่อกำหนดวิธีการเรียงลำดับผลลัพธ์:
วิธี | การใช้งาน |
---|---|
OrderByChild() | ลำดับผลลัพธ์ตามค่าของคีย์เด็กที่ระบุ | OrderByKey() | ผลลัพธ์การสั่งซื้อโดยปุ่มลูก |
OrderByValue() | ลำดับผลลัพธ์ตามค่าลูก |
คุณสามารถใช้วิธีการสั่งซื้อได้ครั้งละ หนึ่ง วิธีเท่านั้น การเรียกใช้เมธอดตามลำดับหลายครั้งในแบบสอบถามเดียวกันทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าคุณสามารถสมัครรับข้อมูลบนลีดเดอร์บอร์ดคะแนนที่เรียงลำดับตามคะแนนได้อย่างไร
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 }
สิ่งนี้กำหนดเคียวรีที่เมื่อรวมกับ ตัวฟังเหตุการณ์ที่เปลี่ยนค่าแล้ว จะซิงโครไนซ์ไคลเอ็นต์กับลีดเดอร์บอร์ดในฐานข้อมูล โดยเรียงลำดับตามคะแนนของแต่ละรายการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการจัดโครงสร้างข้อมูลของคุณอย่างมีประสิทธิภาพได้ใน โครงสร้างฐานข้อมูลของคุณ
การเรียกเมธอด OrderByChild()
ระบุคีย์เด็กเพื่อสั่งผลลัพธ์โดย ในกรณีนี้ ผลลัพธ์จะถูกจัดเรียงตามค่าของค่า "score"
ในแต่ละลูก สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดลำดับประเภทข้อมูลอื่นๆ โปรดดูที่ วิธีจัดลำดับข้อมูลคิวรี
การกรองข้อมูล
ในการกรองข้อมูล คุณสามารถรวมเมธอดขีดจำกัดหรือเมธอดใดๆ เข้ากับเมธอดลำดับตามเมื่อสร้างเคียวรี
วิธี | การใช้งาน |
---|---|
LimitToFirst() | ตั้งค่าจำนวนรายการสูงสุดที่จะส่งคืนจากจุดเริ่มต้นของรายการผลลัพธ์ที่เรียงลำดับ |
LimitToLast() | ตั้งค่าจำนวนสูงสุดของรายการที่จะส่งคืนจากจุดสิ้นสุดของรายการผลลัพธ์ที่เรียงลำดับ |
StartAt() | ส่งคืนรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุโดยขึ้นอยู่กับวิธีการสั่งซื้อที่เลือก |
EndAt() | ส่งคืนรายการที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุขึ้นอยู่กับวิธีการสั่งซื้อที่เลือก |
EqualTo() | ส่งคืนรายการเท่ากับคีย์หรือค่าที่ระบุขึ้นอยู่กับวิธีการสั่งซื้อที่เลือก |
คุณสามารถรวมฟังก์ชันจำกัดหรือช่วงได้หลายรายการ ตัวอย่างเช่น คุณสามารถรวมเมธอด StartAt()
และ EndAt()
เพื่อจำกัดผลลัพธ์ให้อยู่ในช่วงของค่าที่ระบุ
แม้ว่าจะมีการค้นหาที่ตรงกันเพียงรายการเดียว สแนปชอตยังคงเป็นรายการ มันมีเพียงรายการเดียว
จำกัดจำนวนผลลัพธ์
คุณสามารถใช้เมธอด LimitToFirst()
และ LimitToLast()
เพื่อตั้งค่าจำนวนลูกสูงสุดที่จะซิงค์สำหรับการโทรกลับที่กำหนด ตัวอย่างเช่น หากคุณใช้ LimitToFirst()
เพื่อตั้งค่าขีดจำกัดที่ 100 คุณจะได้รับการโทรกลับ ChildAdded
เพียง 100 ครั้งเท่านั้น หากคุณมีรายการที่เก็บไว้ในฐานข้อมูล Firebase น้อยกว่า 100 รายการ การเรียกกลับ ChildAdded
จะเริ่มทำงานสำหรับแต่ละรายการ
เมื่อรายการเปลี่ยนแปลง คุณจะได้รับการโทรกลับ ChildAdded
สำหรับรายการที่ป้อนแบบสอบถาม และการโทรกลับ 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()
ยกเว้นว่าจะใช้ค่าของโหนดแทนค่าของคีย์ลูกที่ระบุ