การดึงข้อมูลด้วยฐานข้อมูลเรียลไทม์ของ Firebase สำหรับ C++

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

ก่อนจะเริ่ม

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าแอพของคุณและสามารถเข้าถึงฐานข้อมูลตามที่อธิบายไว้ในคู่มือ Get Started ใช้งาน

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

ข้อมูล Firebase ถูกดึงมาโดยการโทรครั้งเดียวไปยัง GetValue() หรือแนบกับ ValueListener บนการอ้างอิง FirebaseDatabase ผู้ฟังค่าถูกเรียกหนึ่งครั้งสำหรับสถานะเริ่มต้นของข้อมูล และอีกครั้งทุกครั้งที่ข้อมูลเปลี่ยนแปลง

รับฐานข้อมูลอ้างอิง

ในการเขียนข้อมูลไปยังฐานข้อมูล คุณต้องมีอินสแตนซ์ของ DatabaseReference :

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

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

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

  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

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

  // In the game loop that polls for the result...

  if (result.status() != firebase::kFutureStatusPending) {
    if (result.status() != firebase::kFutureStatusComplete) {
      LogMessage("ERROR: GetValue() returned an invalid result.");
      // Handle the error...
    } else if (result.error() != firebase::database::kErrorNone) {
      LogMessage("ERROR: GetValue() returned error %d: %s", result.error(),
                 result.error_message());
      // Handle the error...
    } else {
      firebase::database::DataSnapshot snapshot = result.result();
      // Do something with the snapshot...
    }
  }

ข้อมูลนี้แสดงการตรวจสอบข้อผิดพลาดพื้นฐาน ดูข้อมูลอ้างอิงของ firebase::Future สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบข้อผิดพลาด และวิธีพิจารณาเมื่อผลลัพธ์พร้อม

ฟังเหตุการณ์

คุณสามารถเพิ่มผู้ฟังเพื่อติดตามการเปลี่ยนแปลงข้อมูล:

คลาสฐาน ValueListener

โทรกลับ การใช้งานทั่วไป
OnValueChanged อ่านและฟังการเปลี่ยนแปลงเนื้อหาทั้งหมดของเส้นทาง

คลาสพื้นฐาน OnChildListener

OnChildAdded ดึงข้อมูลรายการหรือฟังรายการเพิ่มเติมในรายการ แนะนำให้ใช้กับ OnChildChanged และ OnChildRemoved เพื่อตรวจสอบการเปลี่ยนแปลงของรายการ
OnChildChanged ฟังการเปลี่ยนแปลงของรายการในรายการ ใช้กับ OnChildAdded และ OnChildRemoved เพื่อตรวจสอบการเปลี่ยนแปลงในรายการ
OnChildRemoved ฟังรายการที่ถูกลบออกจากรายการ ใช้กับ OnChildAdded และ OnChildChanged เพื่อตรวจสอบการเปลี่ยนแปลงของรายการ
OnChildMoved ฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่สั่งซื้อ การเรียกกลับของ OnChildMoved จะเป็นไปตามการเรียกกลับของ OnChildChanged เสมอ เนื่องจากคำสั่งซื้อของรายการเปลี่ยนแปลง (ตามวิธีการสั่งซื้อปัจจุบันของคุณ)

คลาส ValueListener

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

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

  class LeadersValueListener : public firebase::database::ValueListener {
   public:
    void OnValueChanged(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code,
                 error_message);
    }
  };

  // Elsewhere in the code...

  LeadersValueListener* listener = new LeadersValueListener();
  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

Future&ltDataSnaphot&gt มีข้อมูลที่ตำแหน่งที่ระบุในฐานข้อมูล ณ เวลาที่เกิดเหตุการณ์ การเรียก value() ในสแนปชอตส่งคืน Variant ที่แสดงข้อมูล

ในตัวอย่างนี้ วิธี OnCancelled จะถูกแทนที่ด้วยเพื่อดูว่าการอ่านถูกยกเลิกหรือไม่ ตัวอย่างเช่น สามารถยกเลิกการอ่านได้หากไคลเอ็นต์ไม่มีสิทธิ์อ่านจากตำแหน่งฐานข้อมูล Firebase database::Error จะระบุสาเหตุที่เกิดความล้มเหลว

คลาส ChildListener

เหตุการณ์ลูกถูกทริกเกอร์เพื่อตอบสนองต่อการดำเนินการเฉพาะที่เกิดขึ้นกับลูกของโหนดจากการดำเนินการ เช่น เด็กใหม่ที่เพิ่มผ่าน PushChild() หรือรายการย่อยที่ได้รับการอัปเดตผ่านเมธอด UpdateChildren() สิ่งเหล่านี้ร่วมกันมีประโยชน์สำหรับการฟังการเปลี่ยนแปลงโหนดเฉพาะในฐานข้อมูล ตัวอย่างเช่น เกมอาจใช้วิธีการเหล่านี้ร่วมกันเพื่อติดตามกิจกรรมในความคิดเห็นของเซสชันเกมดังที่แสดงด้านล่าง:

  class SessionCommentsChildListener : public firebase::database::ChildListener {
   public:
    void OnChildAdded(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildChanged(const firebase::database::DataSnapshot& snapshot,
                        const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildRemoved(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot ...
    }
    void OnChildMoved(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s",
                 error_code, error_message);
    }
  };

  // elsewhere ....

  SessionCommentsChildListener* listener = new SessionCommentsChildListener();
  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

โดยทั่วไปแล้วการเรียกกลับ OnChildAdded จะใช้เพื่อดึงข้อมูลรายการในฐานข้อมูล Firebase การเรียกกลับ OnChildAdded ถูกเรียกหนึ่งครั้งสำหรับเด็กที่มีอยู่แต่ละคน และอีกครั้งทุกครั้งที่มีการเพิ่มลูกใหม่ในเส้นทางที่ระบุ ผู้ฟังจะถูกส่งผ่านสแน็ปช็อตที่มีข้อมูลของเด็กใหม่

การเรียกกลับ OnChildChanged จะถูกเรียกทุกครั้งที่มีการปรับเปลี่ยนโหนดย่อย ซึ่งรวมถึงการปรับเปลี่ยนใด ๆ กับลูกหลานของโหนดย่อย โดยทั่วไปจะใช้ร่วมกับการ OnChildAdded และ OnChildRemoved เพื่อตอบสนองต่อการเปลี่ยนแปลงของรายการ สแนปชอตที่ส่งไปยังผู้ฟังมีข้อมูลที่อัปเดตสำหรับเด็ก

การโทรกลับ OnChildRemoved จะถูกทริกเกอร์เมื่อมีการเอาลูกที่อยู่ใกล้เคียงออก โดยทั่วไปจะใช้ร่วมกับการเรียกกลับ OnChildAdded และ OnChildChanged สแน็ปช็อตที่ส่งไปยังการโทรกลับมีข้อมูลสำหรับเด็กที่ถูกลบ

การเรียกกลับของ OnChildMoved จะถูกทริกเกอร์ทุกครั้งที่มีการเรียก OnChildChanged โดยการอัปเดตที่ทำให้เกิดการเรียงลำดับใหม่ของรายการย่อย ใช้กับข้อมูลที่สั่งซื้อด้วย OrderByChild หรือ OrderByValue

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

คุณสามารถใช้คลาส Realtime Database Query เพื่อดึงข้อมูลที่จัดเรียงตามคีย์ ตามค่า หรือตามค่าของเด็ก คุณยังสามารถกรองผลลัพธ์ที่จัดเรียงตามจำนวนผลลัพธ์ที่ระบุ หรือช่วงของคีย์หรือค่าต่างๆ ได้อีกด้วย

จัดเรียงข้อมูล

ในการดึงข้อมูลที่จัดเรียง ให้เริ่มต้นด้วยการระบุวิธีเรียงลำดับตามวิธีใดวิธีหนึ่งเพื่อกำหนดวิธีการเรียงลำดับผลลัพธ์:

วิธี การใช้งาน
OrderByChild() เรียงลำดับผลลัพธ์ตามค่าของคีย์ย่อยที่ระบุ
OrderByKey() เรียงลำดับผลลัพธ์ด้วยคีย์ย่อย
OrderByValue() เรียงลำดับผลลัพธ์ตามค่าลูก

คุณสามารถใช้ วิธี สั่งซื้อได้ครั้งละหนึ่งวิธีเท่านั้น การเรียกวิธีการเรียงลำดับหลายครั้งในแบบสอบถามเดียวกันทำให้เกิดข้อผิดพลาด

ตัวอย่างต่อไปนี้จะสาธิตวิธีสมัครรับกระดานผู้นำคะแนนโดยเรียงตามคะแนน

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score");

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

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

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

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

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

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

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

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

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

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

เมื่อรายการเปลี่ยนไป คุณจะได้รับการเรียกกลับของ OnChildAdded สำหรับรายการที่ป้อนการสืบค้นและการเรียกกลับของ OnChildRemoved สำหรับรายการที่เลื่อนออกไปเพื่อให้จำนวนรวมอยู่ที่ 100

ตัวอย่างเช่น รหัสด้านล่างส่งคืนคะแนนสูงสุดจากลีดเดอร์บอร์ด:

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1);

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

กรองตามคีย์หรือค่า

คุณสามารถใช้ 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() ยกเว้นว่าจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ

ขั้นตอนถัดไป