ใช้งานรายการข้อมูลในแพลตฟอร์ม Apple

รับ FIRDatabaseReference

หากต้องการอ่านหรือเขียนข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ FIRDatabaseReference:

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];

การอ่านและการเขียนรายการ

ต่อท้ายรายการข้อมูล

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

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

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

ฟังเหตุการณ์ของบุตรหลาน

ระบบจะทริกเกอร์เหตุการณ์ย่อยเพื่อตอบสนองต่อการดำเนินการบางอย่างที่เกิดขึ้นกับ ย่อยของโหนดจากการดำเนินการ เช่น รายการย่อยใหม่ที่เพิ่มผ่าน เมธอด childByAutoId หรือย่อยที่ได้รับการอัปเดตผ่าน updateChildValues วิธี

ประเภทเหตุการณ์ การใช้งานทั่วไป
FIRDataEventTypeChildAdded ดึงข้อมูลรายการต่างๆ หรือฟังการเพิ่มในรายการ เหตุการณ์นี้จะทริกเกอร์ 1 ครั้งสำหรับผู้เผยแพร่โฆษณาย่อยแต่ละรายการที่มีอยู่ แล้วจึงทริกเกอร์อีกครั้ง ทุกครั้งที่มีการเพิ่มรายการย่อยใหม่ลงในเส้นทางที่ระบุ ผู้ฟังคือ ส่งสแนปชอตที่มีข้อมูลของผู้เผยแพร่โฆษณาย่อยใหม่
FIRDataEventTypeChildChanged ฟังการเปลี่ยนแปลงของรายการ เหตุการณ์นี้จะถูกทริกเกอร์ทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการแก้ไข องค์ประกอบสืบทอดของโหนดย่อย สแนปชอตที่ส่งไปยัง Listener เหตุการณ์ มีข้อมูลที่อัปเดตสำหรับผู้เผยแพร่โฆษณาย่อย
FIRDataEventTypeChildRemoved คอยฟังรายการที่ถูกนำออก เหตุการณ์นี้จะเกิดขึ้นเมื่อ นำรายการย่อยทันทีออกแล้ว สแนปชอตที่ส่งไปยังบล็อก Callback มีข้อมูลย่อยที่นำออกไปแล้ว
FIRDataEventTypeChildMoved คอยฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่เรียงลำดับ เหตุการณ์นี้จะเกิดขึ้นเมื่อการอัปเดตทำให้เกิดการจัดเรียงแคมเปญ ของบุตรหลาน โดยจะใช้กับข้อมูลที่จัดเรียงตาม queryOrderedByChild หรือ queryOrderedByValue

การใช้ทั้ง 2 อย่างนี้รวมกันจะเป็นประโยชน์ต่อการตอบสนองต่อการเปลี่ยนแปลง ในฐานข้อมูล เช่น แอปบล็อกโซเชียลอาจใช้วิธีการเหล่านี้ ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของโพสต์ ดังที่ปรากฏด้านล่าง:

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(
    at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})
// Listen for deleted comments in the Firebase database
commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in
  let index = self.indexOfMessage(snapshot)
  self.comments.remove(at: index)
  self.tableView.deleteRows(
    at: [IndexPath(row: index, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Listen for new comments in the Firebase database
[_commentsRef
              observeEventType:FIRDataEventTypeChildAdded
              withBlock:^(FIRDataSnapshot *snapshot) {
                [self.comments addObject:snapshot];
                [self.tableView insertRowsAtIndexPaths:@[
                  [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments]
                ]
                                      withRowAnimation:UITableViewRowAnimationAutomatic];
              }];
// Listen for deleted comments in the Firebase database
[_commentsRef
 observeEventType:FIRDataEventTypeChildRemoved
 withBlock:^(FIRDataSnapshot *snapshot) {
   int index = [self indexOfMessage:snapshot];
   [self.comments removeObjectAtIndex:index];
   [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]]
                         withRowAnimation:UITableViewRowAnimationAutomatic];
 }];

ฟังเหตุการณ์ที่มีคุณค่า

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

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

แม้ว่าข้อความค้นหาจะมีผลลัพธ์ที่ตรงกันเพียงรายการเดียว แต่ภาพรวมก็ยังคงเป็น list; จะมีแค่รายการเดียว หากต้องการเข้าถึงรายการ คุณจะต้องวนซ้ำ มากกว่าผลลัพธ์:

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

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

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

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

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

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

วิธีการ การใช้งาน
queryOrderedByKey เรียงลำดับผลการค้นหาตามคีย์ย่อย
queryOrderedByValue เรียงลำดับผลลัพธ์ตามค่าย่อย
queryOrderedByChild เรียงลำดับผลลัพธ์ตามค่าของคีย์ย่อยที่ระบุหรือเส้นทางย่อยที่ซ้อนกัน

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

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

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

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

การเรียกเมธอด queryOrderedByChild จะระบุคีย์ย่อยที่จะเรียงลำดับ ผลลัพธ์ตาม ในตัวอย่างนี้ โพสต์จะจัดเรียงตามค่าของ เด็ก "starCount" คนในแต่ละโพสต์ คำค้นหาสามารถเรียงลำดับตามการซ้อน สำหรับเด็ก ในกรณีที่คุณมีข้อมูลที่มีลักษณะดังนี้

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

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

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเรียงลำดับข้อมูลประเภทอื่นๆ ดูวิธีเรียงลำดับข้อมูลคำค้นหา

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

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

วิธีการ การใช้งาน
queryLimitedToFirst กำหนดจำนวนรายการสูงสุดที่จะส่งคืนตั้งแต่ต้น รายการผลลัพธ์ตามลำดับ
queryLimitedToLast กำหนดจำนวนสินค้าสูงสุดที่จะส่งคืนจากสิ้นสุดสินค้าที่สั่งซื้อ รายการผลลัพธ์
queryStartingAtValue แสดงรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้
queryStartingAfterValue แสดงรายการที่มากกว่าคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้
queryEndingAtValue แสดงรายการที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้
queryEndingBeforeValue ส่งคืนรายการน้อยกว่าคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือกไว้
queryEqualToValue แสดงรายการผลการค้นหาเท่ากับคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับ เลือกลำดับตามวิธีการ

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

จำกัดจำนวนผลการค้นหา

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

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

ตัวอย่างต่อไปนี้จะแสดงให้เห็นวิธีที่แอปการเขียนบล็อกตัวอย่างสามารถเรียกข้อมูล รายการ 100 บทความล่าสุดโดยผู้ใช้ทั้งหมด:

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Objective-C

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย App Clip
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

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

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

วิธีเรียงลำดับข้อมูลข้อความค้นหา

ส่วนนี้จะอธิบายวิธีการจัดเรียงข้อมูลตามวิธีการเรียงลำดับแต่ละวิธีใน FIRDatabaseQuery ชั้นเรียน

queryOrderedByKey

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

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

queryOrderedByValue

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

queryOrderedByChild

เมื่อใช้ queryOrderedByChild ข้อมูลที่มีคีย์ย่อยที่ระบุจะเป็น มีลำดับดังนี้

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

ปลดผู้ฟังออก

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

เมื่อคุณเพิ่มบล็อก Callback ไปยังข้อมูลอ้างอิง ระบบจะแสดงผล FIRDatabaseHandle คุณใช้แฮนเดิลเหล่านี้เพื่อนำการบล็อก Callback ออกได้

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

การเรียก removeObserverWithHandle หรือ removeAllObservers ในการฟัง ไม่นำ Listener ที่ลงทะเบียนในโหนดย่อยออกโดยอัตโนมัติ คุณยังต้อง ติดตามข้อมูลอ้างอิงหรือแฮนเดิลเหล่านั้นเพื่อนำออก

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