รับ 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 จะแสดงคีย์ที่สร้างขึ้นโดยอัตโนมัติ
คุณสามารถใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้เพื่อลดความซับซ้อนในการแปลงโครงสร้างข้อมูลให้เป็นรูปแบบแบนได้ ดูข้อมูลเพิ่มเติมได้ที่ตัวอย่างแฟนเอาต์ (Fan-Out) ของข้อมูล
ฟังเหตุการณ์ย่อย
เหตุการณ์ของโหนดย่อยจะทริกเกอร์เพื่อตอบสนองต่อการดำเนินการที่เฉพาะเจาะจงซึ่งเกิดขึ้นกับ
โหนดย่อยของโหนดจากการดำเนินการ เช่น การเพิ่มโหนดย่อยใหม่ผ่านเมธอด childByAutoId หรือการอัปเดตโหนดย่อยผ่านเมธอด updateChildValues
| ประเภทเหตุการณ์ | การใช้งานทั่วไป |
|---|---|
FIRDataEventTypeChildAdded |
ดึงข้อมูลรายการหรือฟังการเพิ่มรายการลงในลิสต์ ระบบจะทริกเกอร์เหตุการณ์นี้ 1 ครั้งสำหรับบุตรหลานแต่ละคนที่มีอยู่ แล้วทริกเกอร์อีกครั้ง ทุกครั้งที่มีการเพิ่มบุตรหลานคนใหม่ไปยังเส้นทางที่ระบุ ระบบจะส่งสแนปชอตที่มีข้อมูลของบุตรหลานคนใหม่ให้ Listener |
FIRDataEventTypeChildChanged |
ฟังการเปลี่ยนแปลงของรายการในลิสต์ เหตุการณ์นี้จะทริกเกอร์ทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการแก้ไขใดๆ ใน ลูกหลานของโหนดลูก สแนปชอตที่ส่งไปยัง Listener เหตุการณ์ มีข้อมูลที่อัปเดตแล้วสำหรับบุตรหลาน |
FIRDataEventTypeChildRemoved |
ฟังรายการที่ถูกนำออกจากลิสต์ เหตุการณ์นี้จะทริกเกอร์เมื่อ มีการนำองค์ประกอบย่อยที่อยู่ติดกันออก สแนปชอตที่ส่งไปยังบล็อกการเรียกกลับ มีข้อมูลขององค์ประกอบย่อยที่นำออก |
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 Observer ไปยังรายการข้อมูลจะส่งคืนรายการข้อมูลทั้งหมดเป็น 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 เพื่อเรียกข้อมูลที่จัดเรียง
ตามคีย์ ตามค่า หรือตามค่าของรายการย่อยได้ นอกจากนี้ คุณยังกรองผลลัพธ์ที่จัดเรียงแล้วให้แสดงผลลัพธ์ตามจำนวนที่ต้องการ หรือแสดงผลลัพธ์ตามช่วงของคีย์หรือค่าได้ด้วย
จัดเรียงข้อมูล
หากต้องการดึงข้อมูลที่จัดเรียงแล้ว ให้เริ่มต้นด้วยการระบุเมธอด order-by อย่างใดอย่างหนึ่งเพื่อ กำหนดวิธีจัดเรียงผลลัพธ์
| วิธีการ | การใช้งาน |
|---|---|
queryOrderedByKey
| จัดเรียงผลลัพธ์ตามคีย์ย่อย |
queryOrderedByValue |
จัดเรียงผลลัพธ์ตามค่าขององค์ประกอบย่อย |
queryOrderedByChild |
จัดเรียงผลลัพธ์ตามค่าของคีย์ย่อยหรือเส้นทางย่อยที่ซ้อนกันที่ระบุ |
คุณใช้ได้เพียงหนึ่งเมธอดการจัดเรียงลำดับในแต่ละครั้ง การเรียกใช้เมธอดการจัดเรียงลำดับหลายครั้งในคำค้นหาเดียวกันจะทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงวิธีดึงรายการโพสต์ยอดนิยมของ ผู้ใช้ที่จัดเรียงตามจำนวนดาว
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 |
แสดงรายการที่เท่ากับคีย์หรือค่าที่ระบุ ทั้งนี้ขึ้นอยู่กับ เมธอดการจัดเรียงลำดับที่เลือก |
คุณรวมฟังก์ชัน limit หรือ range หลายรายการได้ ซึ่งต่างจากเมธอด order-by
เช่น คุณสามารถรวมเมธอด queryStartingAtValue และ queryEndingAtValue เพื่อจำกัดผลลัพธ์ให้อยู่ในช่วงค่าที่ระบุ
จำกัดจำนวนผลลัพธ์
คุณสามารถใช้วิธี queryLimitedToFirst และ queryLimitedToLast เพื่อตั้งค่า
จำนวนบุตรหลานสูงสุดที่จะซิงค์สำหรับการเรียกกลับที่ระบุ เช่น หากคุณใช้ queryLimitedToFirst เพื่อกำหนดขีดจำกัดที่ 100 คุณจะได้รับการเรียกกลับ FIRDataEventTypeChildAdded สูงสุด 100 รายการในตอนแรก หากคุณมีสินค้าที่จัดเก็บไว้ในฐานข้อมูล Firebase น้อยกว่า 100 รายการ FIRDataEventTypeChildAddedการเรียกกลับจะทริกเกอร์สำหรับสินค้าแต่ละรายการ
เมื่อสินค้ามีการเปลี่ยนแปลง คุณจะได้รับFIRDataEventTypeChildAddedการเรียกกลับสำหรับสินค้าที่เข้าสู่คำค้นหา
และFIRDataEventTypeChildRemovedการเรียกกลับสำหรับสินค้าที่ออกจากคำค้นหา เพื่อให้
จำนวนรวมยังคงอยู่ที่ 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
เพื่อเลือกจุดเริ่มต้น จุดสิ้นสุด และจุดเทียบเท่าที่กำหนดเองสำหรับคำค้นหา ซึ่งมีประโยชน์ในการแบ่งหน้าข้อมูลหรือค้นหารายการที่มีบุตรหลานซึ่งมีค่าที่เฉพาะเจาะจง
วิธีจัดเรียงข้อมูลการค้นหา
ส่วนนี้จะอธิบายวิธีจัดเรียงข้อมูลตามวิธีการจัดเรียงแต่ละวิธีในคลาส
FIRDatabaseQuery
queryOrderedByKey
เมื่อใช้ queryOrderedByKey เพื่อจัดเรียงข้อมูล ระบบจะแสดงข้อมูลตามลำดับจากน้อยไปมาก
ตามคีย์
- เด็กที่มีคีย์ที่แยกวิเคราะห์เป็นจำนวนเต็ม 32 บิตได้จะแสดงก่อน โดยเรียงตามลำดับจากน้อยไปมาก
- จากนั้นจะเป็นเด็กที่มีค่าสตริงเป็นคีย์ โดยจะจัดเรียงตามลำดับตัวอักษรจากน้อยไปมาก
queryOrderedByValue
เมื่อใช้ queryOrderedByValue ระบบจะจัดเรียงเด็กๆ ตามมูลค่าของเด็ก เกณฑ์การจัดเรียง
จะเหมือนกับใน queryOrderedByChild ยกเว้นจะใช้ค่าของโหนดแทนค่าของคีย์ย่อยที่ระบุ
queryOrderedByChild
เมื่อใช้ queryOrderedByChild ข้อมูลที่มีคีย์ย่อยที่ระบุจะ
จัดเรียงดังนี้
- เด็กที่มีค่า
nilสำหรับคีย์ของเด็กที่ระบุจะแสดงก่อน - จากนั้นจะเป็นเด็กที่มีค่า
falseสำหรับคีย์ย่อยที่ระบุ หากมีบุตรหลายคนที่มีค่าเป็นfalseระบบจะ จัดเรียงตามพจนานุกรมตามคีย์ - จากนั้นจะเป็นเด็กที่มีค่า
trueสำหรับคีย์ย่อยที่ระบุ หากมีบุตรหลายคนที่มีค่าเป็นtrueระบบจะ จัดเรียงตามพจนานุกรมตามคีย์ - จากนั้นจะเป็นชื่อที่มีค่าตัวเลข โดยจัดเรียงจากน้อยไปมาก หาก บุตรหลานหลายคนมีค่าตัวเลขเดียวกันสำหรับโหนดย่อยที่ระบุ ระบบจะจัดเรียงตามคีย์
- สตริงจะอยู่หลังตัวเลขและจัดเรียงตามลำดับตัวอักษรจากน้อยไปมาก หากบุตรหลานหลายคนมีค่าเดียวกันสำหรับโหนด child ที่ระบุ ระบบจะจัดเรียงตามพจนานุกรมตามคีย์
- ออบเจ็กต์จะอยู่ท้ายสุดและจัดเรียงตามพจนานุกรมตามคีย์จากน้อยไปมาก
ยกเลิกการเชื่อมต่อ Listener
ผู้สังเกตการณ์จะไม่หยุดซิงค์ข้อมูลโดยอัตโนมัติเมื่อคุณออกจาก
ViewController หากไม่ได้นำ Observer ออกอย่างถูกต้อง ระบบจะซิงค์ข้อมูลไปยังหน่วยความจำในเครื่องต่อไป และจะเก็บออบเจ็กต์ที่จับได้ใน Closure ของตัวแฮนเดิลเหตุการณ์ ซึ่งอาจทำให้เกิดหน่วยความจำรั่ว เมื่อไม่ต้องการใช้ Observer อีกต่อไป
ให้นำออกโดยส่ง FIRDatabaseHandle ที่เกี่ยวข้องไปยังเมธอด
removeObserverWithHandle
เมื่อเพิ่มบล็อกการโทรกลับในการอ้างอิง ระบบจะแสดงผล FIRDatabaseHandle
คุณใช้แฮนเดิลเหล่านี้เพื่อนำการบล็อกการเรียกกลับออกได้
หากเพิ่ม Listener หลายรายการไปยังการอ้างอิงฐานข้อมูล ระบบจะเรียกใช้ Listener แต่ละรายการเมื่อมีการเรียกใช้เหตุการณ์
หากต้องการหยุดซิงค์ข้อมูลในสถานที่นั้น
คุณต้องนำผู้สังเกตการณ์ทั้งหมดในสถานที่ออกโดยเรียกใช้เมธอด removeAllObservers
การเรียกใช้ removeObserverWithHandle หรือ removeAllObservers ใน Listener จะไม่นำ Listener ที่ลงทะเบียนในโหนดย่อยออกโดยอัตโนมัติ คุณต้องติดตามการอ้างอิงหรือแฮนเดิลเหล่านั้นเพื่อนำออกด้วย