หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

ก่อนที่คุณจะเริ่ม

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

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

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

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

  • เพิ่ม Firebase Unity SDK (โดยเฉพาะ FirebaseDatabase.unitypackage ) ในโครงการ Unity ของคุณ

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

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

ข้อมูล Firebase จะดึงมาโดยการเรียกใช้ GetValueAsync () ครั้งเดียวหรือแนบกับเหตุการณ์บนข้อมูลอ้างอิง FirebaseDatabase ตัวฟังเหตุการณ์จะถูกเรียกหนึ่งครั้งสำหรับสถานะเริ่มต้นของข้อมูลและอีกครั้งเมื่อใดก็ตามที่ข้อมูลเปลี่ยนแปลง

รับ DatabaseReference

ในการอ่านข้อมูลจากฐานข้อมูลคุณต้องมีอินสแตนซ์ของ DatabaseReference :

using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;

public class MyScript: MonoBehaviour {
  void Start() {
    // Set up the Editor before calling into the realtime database.
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://YOUR-FIREBASE-APP.firebaseio.com/");

    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

อ่านข้อมูลครั้งเดียว

คุณสามารถใช้เมธอด GetValueAsync เพื่ออ่านสแน็ปช็อตของเนื้อหาตามเส้นทางที่กำหนดหนึ่งครั้ง ผลลัพธ์ของงานจะมีสแนปชอตที่มีข้อมูลทั้งหมดในตำแหน่งนั้นรวมถึงข้อมูลลูก หากไม่มีข้อมูลสแนปชอตที่ส่งคืนจะเป็น null

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWith(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 เพื่อสมัครรับข้อมูลการเปลี่ยนแปลงของเนื้อหาตามเส้นทางที่กำหนด เหตุการณ์นี้จะเกิดขึ้นหนึ่งครั้งเมื่อมีการแนบ Listener และอีกครั้งทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลรวมทั้งเด็ก การเรียกกลับเหตุการณ์จะถูกส่งผ่านสแนปชอตที่มีข้อมูลทั้งหมดในตำแหน่งนั้นรวมถึงข้อมูลลูก หากไม่มีข้อมูลสแนปชอตที่ส่งคืนจะเป็น null

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงเกมที่ดึงคะแนนของลีดเดอร์บอร์ดจากฐานข้อมูล:

236fedbc 17

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 เหตุการณ์ ChildAdded จะใช้เพื่อดึงข้อมูลรายการในฐานข้อมูล Firebase เหตุการณ์ ChildAdded จะถูกเพิ่มขึ้นหนึ่งครั้งสำหรับเด็กแต่ละคนที่มีอยู่และจากนั้นอีกครั้งทุกครั้งที่มีการเพิ่มเด็กใหม่ในเส้นทางที่ระบุ Listener จะถูกส่งผ่าน snapshot ที่มีข้อมูลของเด็กคนใหม่

เหตุการณ์ 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 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 พวกเขาจะเรียงตาม ศัพท์ ตามคีย์
  3. เด็กที่มีค่า true สำหรับคีย์ลูกที่ระบุจะเป็นลำดับถัดไป หากลูกหลายคนมีค่า true พวกเขาจะเรียงตามศัพท์ตามคีย์
  4. เด็กที่มีค่าตัวเลขจะตามมาเรียงลำดับจากน้อยไปมาก หากลูกหลายตัวมีค่าตัวเลขเดียวกันสำหรับโหนดลูกที่ระบุพวกเขาจะเรียงลำดับตามคีย์
  5. สตริงมาหลังตัวเลขและเรียงตามศัพท์จากน้อยไปหามาก หากลูกหลายคนมีค่าเดียวกันสำหรับโหนดลูกที่ระบุเด็กเหล่านั้นจะเรียงลำดับตามคำศัพท์ตามคีย์
  6. ออบเจ็กต์มาสุดท้ายและเรียงตามศัพท์ตามคีย์จากน้อยไปมาก

OrderByKey

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

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

OrderByValue

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