กำลังดึงข้อมูล

เอกสารนี้ครอบคลุมถึงพื้นฐานของการดึงข้อมูลและวิธีสั่งซื้อและกรองข้อมูล 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 ที่ทำให้ลำดับของรายการเปลี่ยนแปลง (ขึ้นอยู่กับวิธีการเรียงลำดับปัจจุบันของคุณ)

เหตุการณ์ ValueChanged

คุณสามารถใช้เหตุการณ์ ValueChanged เพื่อสมัครรับการเปลี่ยนแปลงของเนื้อหาในเส้นทางที่กำหนด เหตุการณ์นี้จะเกิดขึ้นครั้งเดียวเมื่อมีการแนบผู้ฟัง และอีกครั้งทุกครั้งที่ข้อมูล รวมถึงลูกๆ มีการเปลี่ยนแปลง การเรียกกลับของเหตุการณ์จะถูกส่งผ่านสแน็ปช็อตที่มีข้อมูลทั้งหมด ณ ตำแหน่งนั้น รวมถึงข้อมูลย่อย หากไม่มีข้อมูล สแน็ปช็อตที่ส่งคืนจะเป็น 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 ครั้งเท่านั้น หากคุณมีรายการน้อยกว่า 100 รายการเก็บไว้ในฐานข้อมูล Firebase การโทรกลับของ 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() ข้อมูลที่มีคีย์ย่อยที่ระบุจะถูกเรียงลำดับดังนี้:

  1. รายการย่อยที่มี null สำหรับคีย์ย่อยที่ระบุมาก่อน
  2. รายการย่อยที่มีค่า false สำหรับคีย์ย่อยที่ระบุอยู่ถัดไป หากชายด์หลายคนมีค่า false พวกเขาจะถูกจัดเรียงตาม พจนานุกรม ตามคีย์
  3. รายการย่อยที่มีค่า true สำหรับคีย์ย่อยที่ระบุอยู่ถัดไป หากชายน์หลายคนมีค่า true พวกเขาจะถูกจัดเรียงตามพจนานุกรมตามคีย์
  4. เด็กที่มีค่าตัวเลขมาถัดไปโดยเรียงลำดับจากน้อยไปมาก หากโหนดชายน์หลายคนมีค่าตัวเลขเหมือนกันสำหรับโหนดชายน์ที่ระบุ พวกเขาจะถูกจัดเรียงตามคีย์
  5. สตริงมาหลังตัวเลขและจัดเรียงตามลำดับศัพท์จากน้อยไปหามาก หากชายน์หลายคนมีค่าเท่ากันสำหรับโหนดชายน์ที่ระบุ พวกเขาจะถูกจัดลำดับตามพจนานุกรมโดยคีย์
  6. ออบเจ็กต์จะอยู่ท้ายสุดและจัดเรียงตามพจนานุกรมโดยคีย์ในลำดับจากน้อยไปมาก

OrderByKey

เมื่อใช้ OrderByKey() เพื่อจัดเรียงข้อมูลของคุณ ข้อมูลจะถูกส่งคืนโดยเรียงลำดับจากน้อยไปมากตามคีย์

  1. รายการย่อยที่มีคีย์ที่สามารถแยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตจะมาก่อน โดยเรียงลำดับจากน้อยไปมาก
  2. รายการย่อยที่มีค่าสตริงเป็นคีย์ถัดไป โดยเรียงลำดับจากน้อยไปหามาก

OrderByValue

เมื่อใช้ OrderByValue() ลูกจะถูกจัดเรียงตามมูลค่า เกณฑ์การสั่งซื้อจะเหมือนกับใน OrderByChild() ยกเว้นว่าจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ