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

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

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

OrderByKey

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

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

OrderByValue

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