Catch up on everthing we announced at this year's Firebase Summit. Learn more

การดึงข้อมูลด้วยฐานข้อมูลเรียลไทม์ของ 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 :: อนาคต อ้างอิงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตรวจสอบข้อผิดพลาดและวิธีการตรวจสอบเมื่อผลที่ได้คือความพร้อม

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

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

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

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

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

OrderByKey

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

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

OrderByValue

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

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