รับ FIRDatabaseReference
หากต้องการอ่านหรือเขียนข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ของ FIRDatabaseReference
ดังนี้
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
รายการการอ่านและการเขียน
ต่อท้ายรายการข้อมูล
ใช้เมธอด childByAutoId
เพื่อเพิ่มข้อมูลต่อท้ายรายการในแอปพลิเคชันสำหรับผู้ใช้หลายคน เมธอด childByAutoId
จะสร้างคีย์ที่ไม่ซ้ำกันทุกครั้งที่มีการเพิ่มรายการย่อยใหม่ลงในข้อมูลอ้างอิง Firebase ที่ระบุ การใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้สำหรับองค์ประกอบใหม่แต่ละรายการในรายการจะช่วยให้ลูกค้าหลายรายเพิ่มรายการย่อยไปยังตำแหน่งเดียวกันในเวลาเดียวกันได้โดยไม่เกิดข้อขัดแย้งในการเขียน childByAutoId
จะสร้างคีย์ที่ไม่ซ้ำกันโดยอิงตามการประทับเวลา ดังนั้นรายการในลิสต์จึงได้รับการจัดเรียงตามลำดับเวลาโดยอัตโนมัติ
คุณสามารถใช้การอ้างอิงไปยังข้อมูลใหม่ที่เมธอด childByAutoId
แสดงผลเพื่อรับค่าของคีย์ที่สร้างขึ้นโดยอัตโนมัติของรายการย่อยหรือตั้งค่าให้กับรายการย่อย
การเรียกใช้ getKey
บนข้อมูลอ้างอิง childByAutoId
จะแสดงคีย์ที่สร้างโดยอัตโนมัติ
คุณสามารถใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้เพื่อลดความซับซ้อนของการปรับโครงสร้างข้อมูล สำหรับข้อมูลเพิ่มเติม โปรดดูตัวอย่างการขยายข้อมูล
คอยฟังเหตุการณ์ย่อย
ระบบจะทริกเกอร์เหตุการณ์ย่อยเพื่อตอบสนองต่อการดำเนินการบางอย่างที่เกิดขึ้นกับโหนดย่อยจากการดำเนินการ เช่น โหนดย่อยใหม่ซึ่งเพิ่มผ่านเมธอด childByAutoId
หรือโหนดย่อยที่อัปเดตผ่านเมธอด updateChildValues
ประเภทเหตุการณ์ | การใช้งานทั่วไป |
---|---|
FIRDataEventTypeChildAdded |
เรียกข้อมูลรายการหรือฟังการเพิ่มเติมรายการ ระบบจะเรียกเหตุการณ์นี้ให้แสดง 1 ครั้งสําหรับรายการย่อยที่มีอยู่แต่ละรายการ แล้วเรียกให้แสดงอีกครั้งทุกครั้งที่มีการเพิ่มรายการย่อยใหม่ลงในเส้นทางที่ระบุ ตัวแฟังจะได้รับสแนปชอตที่มีข้อมูลของบุตรหลานใหม่ |
FIRDataEventTypeChildChanged |
ฟังการเปลี่ยนแปลงของรายการ เหตุการณ์นี้จะถูกทริกเกอร์ทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการแก้ไขใดๆ ก็ตามในโหนดย่อยของโหนดย่อย สแนปชอตที่ส่งไปยังโปรแกรมรับฟังเหตุการณ์จะมีข้อมูลที่อัปเดตแล้วสำหรับรายการย่อย |
FIRDataEventTypeChildRemoved |
ฟังรายการที่นําออกจากรายการ เหตุการณ์นี้จะทริกเกอร์เมื่อมีการนำรายการย่อยทันทีออก ภาพรวมที่ส่งไปยังบล็อก Callback มีข้อมูลของผู้เผยแพร่โฆษณาย่อยที่นำออกไปแล้ว |
FIRDataEventTypeChildMoved |
ฟังการเปลี่ยนแปลงลําดับของรายการในรายการที่เรียงลําดับ
เหตุการณ์นี้จะทริกเกอร์เมื่อใดก็ตามที่มีการอัปเดตทําให้ต้องจัดลําดับรายการย่อยใหม่ ซึ่งจะใช้กับข้อมูลที่จัดเรียงตาม queryOrderedByChild
หรือ queryOrderedByValue
|
รายการเหล่านี้มีประโยชน์ในการรับฟังการเปลี่ยนแปลงของโหนดที่เฉพาะเจาะจงในฐานข้อมูล ตัวอย่างเช่น แอปการเขียนบล็อกโซเชียลอาจใช้วิธีการเหล่านี้ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของโพสต์ ดังที่แสดงด้านล่าง
Swift
// 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
// 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 รายการเดียว จากนั้นคุณจะวนซ้ำเพื่อเข้าถึงรายการย่อยแต่ละรายการได้
แม้ว่าข้อความค้นหาจะมีผลลัพธ์ที่ตรงกันเพียงรายการเดียว แต่สแนปชอตก็ยังคงเป็นลิสต์รายการ ซึ่งมีเพียงรายการเดียวเท่านั้น หากต้องการเข้าถึงรายการ คุณต้องวนดูผลลัพธ์โดยทำดังนี้
Swift
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_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 วิธีเท่านั้น การเรียกใช้เมธอด "order-by" หลายครั้งในคําค้นหาเดียวกันจะทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงวิธีดึงข้อมูลรายการโพสต์ยอดนิยมของผู้ใช้ที่จัดเรียงตามจำนวนดาว
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// 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
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเรียงลำดับข้อมูลประเภทอื่นๆ ได้จากวิธีเรียงลำดับข้อมูลคำค้นหา
การกรองข้อมูล
หากต้องการกรองข้อมูล ให้รวมวิธีการจํากัดหรือช่วงกับวิธีการเรียงลําดับเมื่อสร้างคําค้นหา
วิธีการ | การใช้งาน |
---|---|
queryLimitedToFirst |
กำหนดจำนวนรายการสูงสุดที่จะแสดงผลจากจุดเริ่มต้นของรายการผลลัพธ์ที่มีการเรียงลำดับ |
queryLimitedToLast |
กำหนดจำนวนรายการสูงสุดที่จะแสดงจากท้ายรายการผลลัพธ์ที่จัดเรียง |
queryStartingAtValue |
แสดงรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ทั้งนี้ขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
queryStartingAfterValue |
แสดงผลรายการที่มากกว่าคีย์หรือค่าที่ระบุ ทั้งนี้ขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
queryEndingAtValue |
แสดงผลรายการที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ทั้งนี้ขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
queryEndingBeforeValue |
ส่งคืนสินค้าน้อยกว่าคีย์หรือค่าที่ระบุ ทั้งนี้ขึ้นอยู่กับวิธีการเรียงลำดับตามที่เลือก |
queryEqualToValue |
แสดงผลรายการที่เท่ากับคีย์หรือค่าที่ระบุ โดยขึ้นอยู่กับวิธีการจัดเรียงที่เลือก |
คุณสามารถรวมฟังก์ชันขีดจำกัดหรือช่วงได้หลายรายการ ซึ่งต่างจากเมธอดการเรียงลำดับ
เช่น คุณสามารถรวมเมธอด queryStartingAtValue
และ queryEndingAtValue
เพื่อจํากัดผลลัพธ์ให้อยู่ในช่วงค่าที่ระบุ
จำกัดจำนวนผลลัพธ์
คุณใช้เมธอด queryLimitedToFirst
และ queryLimitedToLast
เพื่อกำหนดจำนวนสูงสุดย่อยที่จะซิงค์สำหรับ Callback ที่กำหนดได้ เช่น หากใช้ queryLimitedToFirst
เพื่อตั้งค่าขีดจํากัดเป็น 100 รายการ ในช่วงแรกคุณจะได้รับ FIRDataEventTypeChildAdded
แคลลบ์แบ็กสูงสุด 100 รายการเท่านั้น หากคุณมีรายการที่จัดเก็บในฐานข้อมูล Firebase น้อยกว่า 100 รายการ ระบบจะเรียกใช้การเรียกกลับ FIRDataEventTypeChildAdded
สำหรับแต่ละรายการ
เมื่อรายการเปลี่ยนแปลง คุณจะได้รับ Callback FIRDataEventTypeChildAdded
รายการสําหรับรายการที่ป้อนคำค้นหาและ FIRDataEventTypeChildRemoved
Callback สําหรับรายการที่ละเว้น ดังนั้นจำนวนรวมจึงยังคงเป็น 100
ตัวอย่างต่อไปนี้แสดงวิธีที่แอปการเขียนบล็อกตัวอย่างอาจดึงข้อมูลรายการโพสต์ล่าสุด 100 รายการของผู้ใช้ทั้งหมด
Swift
// 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
// 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
เพื่อเลือกจุดเริ่มต้น สิ้นสุด และจุดเทียบเท่าที่กำหนดเองสำหรับการค้นหา ซึ่งมีประโยชน์สำหรับการแบ่งหน้าข้อมูลหรือค้นหารายการที่มีรายการย่อยซึ่งมีค่าที่เจาะจง
วิธีเรียงลำดับข้อมูลข้อความค้นหา
ส่วนนี้จะอธิบายวิธีจัดเรียงข้อมูลตามเมธอด order-by แต่ละรายการในคลาส FIRDatabaseQuery
queryOrderedByKey
เมื่อใช้ queryOrderedByKey
เพื่อจัดเรียงข้อมูล ระบบจะแสดงผลลัพธ์ตามลําดับจากน้อยไปมากตามคีย์
- รายการย่อยที่มีคีย์ที่แยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตจะแสดงก่อน โดยจัดเรียงจากน้อยไปมาก
- รายการย่อยที่มีค่าสตริงเป็นคีย์จะแสดงต่อจากนี้ โดยจัดเรียงตามลําดับตัวอักษรจากน้อยไปมาก
queryOrderedByValue
เมื่อใช้ queryOrderedByValue
ระบบจะจัดเรียงรายการย่อยตามค่า เกณฑ์การจัดเรียงจะเหมือนกับใน queryOrderedByChild
ยกเว้นจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ
queryOrderedByChild
เมื่อใช้ queryOrderedByChild
ระบบจะจัดเรียงข้อมูลที่มีคีย์ย่อยที่ระบุดังนี้
- เด็กที่มีค่า
nil
สำหรับคีย์ย่อยที่ระบุจะต้องมาก่อน - รายการย่อยที่มีค่าเป็น
false
สำหรับคีย์ย่อยที่ระบุจะแสดงต่อจากนี้ หากรายการย่อยหลายรายการมีค่าเป็นfalse
ระบบจะจัดเรียงตามลําดับตัวอักษรตามคีย์ - รายการย่อยที่มีค่าเป็น
true
สำหรับคีย์ย่อยที่ระบุจะแสดงต่อจากนี้ หากรายการย่อยหลายรายการมีค่าเป็นtrue
ระบบจะจัดเรียงตามลําดับตัวอักษรตามคีย์ - รายการย่อยที่มีค่าตัวเลขจะแสดงต่อจากนี้โดยจัดเรียงจากน้อยไปมาก หากโหนดย่อยหลายรายการมีค่าตัวเลขเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามคีย์
- สตริงจะอยู่หลังตัวเลขและจัดเรียงตามลําดับตัวอักษรจากน้อยไปมาก หากโหนดย่อยหลายรายการมีค่าเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามลําดับตัวอักษรตามคีย์
- ออบเจ็กต์จะอยู่ท้ายสุดและจัดเรียงตามลําดับตัวอักษรตามคีย์จากน้อยไปมาก
แยก Listener
ผู้สังเกตการณ์จะไม่หยุดซิงค์ข้อมูลโดยอัตโนมัติเมื่อคุณออกจากViewController
หากไม่ได้นำผู้สังเกตการณ์ออกอย่างถูกต้อง ผู้สังเกตการณ์จะซิงค์ข้อมูลไปยังหน่วยความจำในเครื่องต่อไปและจะเก็บออบเจ็กต์ที่จับภาพไว้เมื่อปิดเครื่องจัดการเหตุการณ์ไว้ ซึ่งอาจทำให้หน่วยความจำรั่วไหลได้ เมื่อไม่ต้องใช้ผู้สังเกตการณ์แล้ว ให้นำออกโดยส่ง FIRDatabaseHandle
ที่เชื่อมโยงไปยังเมธอด removeObserverWithHandle
เมื่อคุณเพิ่มบล็อกการเรียกกลับไปยังข้อมูลอ้างอิง ระบบจะแสดงผล FIRDatabaseHandle
คุณใช้แฮนเดิลเหล่านี้เพื่อนำบล็อกการเรียกกลับออกได้
หากเพิ่มตัวรับฟังหลายรายการลงในข้อมูลอ้างอิงฐานข้อมูล ระบบจะเรียกใช้ตัวรับฟังแต่ละรายการเมื่อมีเหตุการณ์เกิดขึ้น หากต้องการหยุดซิงค์ข้อมูลในตำแหน่งนั้น คุณต้องนำผู้สังเกตการณ์ทั้งหมดในตำแหน่งนั้นออกโดยเรียกใช้เมธอด removeAllObservers
การเรียก removeObserverWithHandle
หรือ removeAllObservers
ใน Listener จะไม่นํา Listener ที่ลงทะเบียนในโหนดย่อยออกโดยอัตโนมัติ นอกจากนี้ คุณยังต้องติดตามการอ้างอิงหรือแฮนเดิลเหล่านั้นเพื่อนำออกด้วย