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

เอกสารนี้ครอบคลุมถึงพื้นฐานของการดึงข้อมูลและวิธีสั่งซื้อและกรองข้อมูล Firebase

ก่อนจะเริ่ม

ก่อนที่คุณจะสามารถใช้ เรียลไทม์ฐานข้อมูล คุณต้องไปที่:

  • ลงทะเบียนโครงการ Unity ของคุณและกำหนดค่าให้ใช้ Firebase

    • หากโปรเจ็กต์ Unity ของคุณใช้ Firebase อยู่แล้ว แสดงว่าได้ลงทะเบียนและกำหนดค่าสำหรับ Firebase แล้ว

    • หากคุณไม่ได้มีโครงการเอกภาพคุณสามารถดาวน์โหลด แอปพลิเคตัวอย่าง

  • เพิ่ม Firebase สามัคคี SDK (เฉพาะ FirebaseDatabase.unitypackage ) ให้กับโครงการความสามัคคีของคุณ

หมายเหตุว่าการเพิ่ม Firebase กับโครงการความสามัคคีของคุณเกี่ยวข้องกับงานทั้งใน Firebase คอนโซล และในโครงการความสามัคคีของคุณเปิด (ตัวอย่างเช่นคุณดาวน์โหลดไฟล์การกำหนดค่า Firebase จากคอนโซลแล้วย้ายไปลงในโครงการความสามัคคีของคุณ)

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

ข้อมูล 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

การเรียงลำดับและการกรองข้อมูล

คุณสามารถใช้ฐานข้อมูลเรียลไทม์ 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
    }

นี้กำหนดแบบสอบถามที่เมื่อรวมกับที่ ฟังเหตุการณ์ valuechanged ประสานลูกค้าที่มีลีดเดอร์ในฐานข้อมูลได้รับคำสั่งจากคะแนนของแต่ละรายการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการจัดโครงสร้างข้อมูลของคุณได้อย่างมีประสิทธิภาพใน โครงสร้างฐานข้อมูลของคุณ

โทรไป OrderByChild() วิธีการระบุที่สำคัญเด็กที่จะสั่งซื้อผลการค้นหาใน ในกรณีนี้ผลจะเรียงตามค่าของ "score" ค่าในเด็กแต่ละคน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอื่น ๆ ชนิดข้อมูลที่มีการสั่งซื้อโปรดดูที่ วิธีการค้นหาข้อมูลได้รับคำสั่ง

การกรองข้อมูล

ในการกรองข้อมูล คุณสามารถรวมวิธีการจำกัดหรือช่วงใดๆ กับวิธีการเรียงลำดับเมื่อสร้างแบบสอบถาม

วิธี การใช้งาน
LimitToFirst() ตั้งค่าจำนวนสูงสุดของรายการที่จะส่งคืนจากจุดเริ่มต้นของรายการผลลัพธ์ที่เรียงลำดับ
LimitToLast() ตั้งค่าจำนวนสินค้าสูงสุดที่จะส่งคืนจากรายการผลลัพธ์ที่เรียงลำดับ
StartAt() ส่งกลับรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก
EndAt() ส่งคืนสินค้าที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก
EqualTo() ส่งกลับรายการเท่ากับคีย์หรือค่าที่ระบุขึ้นอยู่กับวิธีการสั่งซื้อที่เลือก

ต่างจากวิธีการเรียงตามลำดับ คุณสามารถรวมฟังก์ชันขีดจำกัดหรือช่วงได้หลายแบบ ตัวอย่างเช่นคุณสามารถรวม StartAt() และ EndAt() วิธีการที่จะ จำกัด ผลให้ช่วงที่ระบุของค่า

แม้ว่าจะมีเพียงรายการที่ตรงกันสำหรับคำค้นหา สแนปชอตก็ยังเป็นรายการ มันมีเพียงรายการเดียว

จำกัดจำนวนผลลัพธ์

คุณสามารถใช้ LimitToFirst() และ LimitToLast() วิธีการที่จะกำหนดจำนวนสูงสุดของเด็กที่จะได้รับการซิงค์สำหรับโทรกลับได้รับ ตัวอย่างเช่นถ้าคุณใช้ LimitToFirst() ที่จะกำหนดวงเงิน 100, คุณเริ่มเพียง แต่ได้รับถึง 100 ChildAdded เรียกกลับ ถ้าคุณมีน้อยกว่า 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 พวกเขาจะเรียง lexicographically โดยคีย์
  3. เด็กที่มีค่าของ true สำหรับคีย์เด็กที่ระบุมาต่อไป ถ้าลูกหลานหลายมีค่า true พวกเขาจะถูกจัดเรียง lexicographically โดยคีย์
  4. เด็กที่มีค่าตัวเลขมาถัดไปโดยเรียงลำดับจากน้อยไปมาก หากชายน์หลายคนมีค่าตัวเลขเหมือนกันสำหรับโหนดชายน์ที่ระบุ พวกเขาจะถูกจัดเรียงตามคีย์
  5. สตริงมาหลังตัวเลขและจัดเรียงตามลำดับศัพท์จากน้อยไปหามาก หากชายน์หลายคนมีค่าเท่ากันสำหรับโหนดชายน์ที่ระบุ พวกเขาจะถูกจัดเรียงตามพจนานุกรมโดยคีย์
  6. ออบเจ็กต์จะอยู่ท้ายสุดและจัดเรียงตามพจนานุกรมโดยคีย์ในลำดับจากน้อยไปมาก

OrderByKey

เมื่อใช้ OrderByKey() ในการจัดเรียงข้อมูลของข้อมูลที่ถูกส่งกลับในเรียงลำดับโดยคีย์

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

OrderByValue

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