รับ 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 |
ฟังการเปลี่ยนแปลงของรายการ เหตุการณ์นี้จะถูกทริกเกอร์ทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการแก้ไข องค์ประกอบสืบทอดของโหนดย่อย สแนปชอตที่ส่งไปยัง Listener เหตุการณ์ มีข้อมูลที่อัปเดตสำหรับผู้เผยแพร่โฆษณาย่อย |
FIRDataEventTypeChildRemoved |
คอยฟังรายการที่ถูกนำออก เหตุการณ์นี้จะเกิดขึ้นเมื่อ นำรายการย่อยทันทีออกแล้ว สแนปชอตที่ส่งไปยังบล็อก Callback มีข้อมูลย่อยที่นำออกไปแล้ว |
FIRDataEventTypeChildMoved |
คอยฟังการเปลี่ยนแปลงลำดับของรายการในรายการที่เรียงลำดับ
เหตุการณ์นี้จะเกิดขึ้นเมื่อการอัปเดตทำให้เกิดการจัดเรียงแคมเปญ
ของบุตรหลาน โดยจะใช้กับข้อมูลที่จัดเรียงตาม queryOrderedByChild
หรือ queryOrderedByValue
|
การใช้ทั้ง 2 อย่างนี้รวมกันจะเป็นประโยชน์ต่อการตอบสนองต่อการเปลี่ยนแปลง ในฐานข้อมูล เช่น แอปบล็อกโซเชียลอาจใช้วิธีการเหล่านี้ ร่วมกันเพื่อตรวจสอบกิจกรรมในความคิดเห็นของโพสต์ ดังที่ปรากฏด้านล่าง:
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 เดียว ซึ่งคุณสามารถวนซ้ำ
เข้าถึงเด็กแต่ละคนได้
แม้ว่าข้อความค้นหาจะมีผลลัพธ์ที่ตรงกันเพียงรายการเดียว แต่ภาพรวมก็ยังคงเป็น list; จะมีแค่รายการเดียว หากต้องการเข้าถึงรายการ คุณจะต้องวนซ้ำ มากกว่าผลลัพธ์:
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 วิธีเท่านั้น การเรียกใช้วิธีการสั่งซื้อ การค้นหาเดียวกันหลายครั้งทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงวิธีที่คุณสามารถเรียกข้อมูลรายการของผู้ใช้ โพสต์ยอดนิยมจัดเรียงตามจำนวนดาว
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"];
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเรียงลำดับข้อมูลประเภทอื่นๆ ดูวิธีเรียงลำดับข้อมูลคำค้นหา
การกรองข้อมูล
ในการกรองข้อมูล คุณสามารถรวมวิธีการจำกัดหรือช่วงเข้ากับ ตามลำดับเมื่อสร้าง 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
// 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
จำนวนจะเป็น จัดเรียงแบบพจนานุกรมตามคีย์ - เด็กที่มีค่าตัวเลขจะแสดงอยู่ถัดไปโดยเรียงลำดับจากน้อยไปหามาก ถ้า เด็กหลายคนมีค่าตัวเลขเหมือนกันสำหรับผู้เผยแพร่โฆษณาย่อยที่ระบุ โหนดจะจัดเรียงตามคีย์
- สตริงอยู่หลังตัวเลขและจัดเรียงแบบพจนานุกรมจากน้อยไปมาก คำสั่งซื้อ กรณีที่รายการย่อยหลายรายการมีค่าเหมือนกันสำหรับรายการย่อยที่ระบุ โหนดจะเรียงลำดับแบบพจนานุกรมตามคีย์
- ออบเจ็กต์อยู่ท้ายสุดและจัดเรียงแบบพจนานุกรมตามคีย์ในลำดับจากน้อยไปมาก
ปลดผู้ฟังออก
ผู้สังเกตการณ์จะไม่หยุดซิงค์ข้อมูลโดยอัตโนมัติเมื่อคุณออกจาก
ViewController
. หากนำผู้สังเกตการณ์ออกอย่างไม่ถูกต้อง ผู้สังเกตการณ์จะยังคงซิงค์ต่อไป
ข้อมูลลงในหน่วยความจำของเครื่องและเก็บรักษาออบเจ็กต์ใดๆ ที่บันทึกในเครื่องจัดการเหตุการณ์
การปิดจะทำให้หน่วยความจำรั่วไหลได้ เมื่อไม่จำเป็นต้องใช้ผู้สังเกตการณ์อีกต่อไป
นำออกโดยการส่ง FIRDatabaseHandle
ที่เกี่ยวข้องไปยัง
removeObserverWithHandle
วิธี
เมื่อคุณเพิ่มบล็อก Callback ไปยังข้อมูลอ้างอิง ระบบจะแสดงผล FIRDatabaseHandle
คุณใช้แฮนเดิลเหล่านี้เพื่อนำการบล็อก Callback ออกได้
ถ้ามีการเพิ่ม Listener หลายรายการไปยังการอ้างอิงฐานข้อมูล Listener แต่ละรายจะถูก
ถูกเรียกเมื่อเกิดเหตุการณ์ หากต้องการหยุดซิงค์ข้อมูลในตำแหน่งดังกล่าว
คุณต้องนำผู้สังเกตการณ์ทั้งหมดออกที่สถานที่หนึ่งๆ โดยโทรหา removeAllObservers
การเรียก removeObserverWithHandle
หรือ removeAllObservers
ในการฟัง
ไม่นำ Listener ที่ลงทะเบียนในโหนดย่อยออกโดยอัตโนมัติ คุณยังต้อง
ติดตามข้อมูลอ้างอิงหรือแฮนเดิลเหล่านั้นเพื่อนำออก