รับ FIRDatabaseReference
หากต้องการอ่านหรือเขียนข้อมูลจากฐานข้อมูล คุณต้องมีอินสแตนซ์ของ FIRDatabaseReference
:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
วัตถุประสงค์-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
การอ่านและการเขียนรายการ
ผนวกเข้ากับรายการข้อมูล
ใช้เมธอด childByAutoId
เพื่อผนวกข้อมูลเข้ากับรายการในแอปพลิเคชันที่มีผู้ใช้หลายคน เมธอด childByAutoId
จะสร้างคีย์เฉพาะทุกครั้งที่มีการเพิ่มชายด์ใหม่ในการอ้างอิง Firebase ที่ระบุ ด้วยการใช้คีย์ที่สร้างขึ้นอัตโนมัติเหล่านี้สำหรับองค์ประกอบใหม่แต่ละรายการในรายการ ลูกค้าหลายรายสามารถเพิ่มรายการย่อยไปยังตำแหน่งเดียวกันได้ในเวลาเดียวกันโดยไม่มีข้อขัดแย้งในการเขียน คีย์เฉพาะที่สร้างโดย childByAutoId
ขึ้นอยู่กับการประทับเวลา ดังนั้นรายการในรายการจะถูกเรียงลำดับตามลำดับเวลาโดยอัตโนมัติ
คุณสามารถใช้การอ้างอิงไปยังข้อมูลใหม่ที่ส่งคืนโดยเมธอด childByAutoId
เพื่อรับค่าของคีย์ที่สร้างโดยอัตโนมัติของเด็กหรือชุดข้อมูลสำหรับเด็ก การเรียก getKey
ในการอ้างอิง childByAutoId
จะคืนค่าคีย์ที่สร้างขึ้นโดยอัตโนมัติ
คุณสามารถใช้คีย์ที่สร้างขึ้นโดยอัตโนมัติเหล่านี้เพื่อลดความซับซ้อนของโครงสร้างข้อมูลของคุณ สำหรับข้อมูลเพิ่มเติม โปรดดู ตัวอย่าง การกระจายข้อมูล
ฟังเหตุการณ์สำหรับเด็ก
เหตุการณ์ลูกถูกทริกเกอร์เพื่อตอบสนองต่อการดำเนินการเฉพาะที่เกิดขึ้นกับชายน์ของโหนดจากการดำเนินการ เช่น เด็กใหม่ที่เพิ่มผ่านเมธอด childByAutoId
หรือรายการย่อยที่ได้รับการอัปเดตผ่านเมธอด updateChildValues
ประเภทงาน | การใช้งานทั่วไป |
---|---|
FIRDataEventTypeChildAdded | ดึงข้อมูลรายการหรือฟังรายการเพิ่มเติมในรายการ เหตุการณ์นี้จะถูกทริกเกอร์หนึ่งครั้งสำหรับเด็กที่มีอยู่แต่ละคน และอีกครั้งทุกครั้งที่มีการเพิ่มเด็กใหม่ในเส้นทางที่ระบุ ผู้ฟังจะส่งสแน็ปช็อตที่มีข้อมูลของเด็กใหม่ |
FIRDataEventTypeChildChanged | ฟังการเปลี่ยนแปลงของรายการในรายการ เหตุการณ์นี้จะถูกทริกเกอร์ทุกครั้งที่มีการแก้ไขโหนดย่อย ซึ่งรวมถึงการปรับเปลี่ยนใด ๆ กับลูกหลานของโหนดย่อย สแนปชอตที่ส่งไปยังผู้ฟังเหตุการณ์มีข้อมูลที่อัปเดตสำหรับเด็ก |
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 ) })
วัตถุประสงค์-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 { ... } }
วัตถุประสงค์-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 | เรียงลำดับผลลัพธ์ตามค่าของคีย์ย่อยที่ระบุหรือพาธย่อยที่ซ้อนกัน |
คุณสามารถใช้ วิธี สั่งซื้อได้ครั้งละหนึ่งวิธีเท่านั้น การเรียกวิธีการเรียงลำดับหลายครั้งในแบบสอบถามเดียวกันทำให้เกิดข้อผิดพลาด
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าคุณสามารถดึงรายการโพสต์ยอดนิยมของผู้ใช้ที่จัดเรียงตามจำนวนดาวได้อย่างไร:
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
วัตถุประสงค์-C
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
แบบสอบถามนี้จะดึงข้อมูลโพสต์ของผู้ใช้จากพาธในฐานข้อมูลตาม ID ผู้ใช้ เรียงลำดับตามจำนวนดาวที่แต่ละโพสต์ได้รับ เทคนิคการใช้ ID เป็นคีย์ดัชนีนี้เรียกว่า data fan out คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมันได้ใน โครงสร้างฐานข้อมูลของคุณ
การเรียกใช้เมธอด 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")
วัตถุประสงค์-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดลำดับข้อมูลประเภทอื่นๆ โปรดดู วิธีจัดลำดับข้อมูลการสืบค้น
การกรองข้อมูล
ในการกรองข้อมูล คุณสามารถรวมวิธีการจำกัดหรือช่วงใดๆ กับวิธีการเรียงลำดับเมื่อสร้างแบบสอบถาม
วิธี | การใช้งาน |
---|---|
queryLimitedToFirst | ตั้งค่าจำนวนสูงสุดของรายการที่จะส่งคืนจากจุดเริ่มต้นของรายการผลลัพธ์ที่เรียงลำดับ |
queryLimitedToLast | ตั้งค่าจำนวนสินค้าสูงสุดที่จะส่งคืนจากรายการผลลัพธ์ที่เรียงลำดับ |
queryStartingAtValue | ส่งกลับรายการที่มากกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
queryStartingAfterValue | ส่งกลับรายการที่มากกว่าคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
queryEndingAtValue | ส่งคืนสินค้าที่น้อยกว่าหรือเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
queryEndingBeforeValue | ส่งคืนสินค้าที่น้อยกว่าคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการสั่งซื้อที่เลือก |
queryEqualToValue | ส่งกลับรายการเท่ากับคีย์หรือค่าที่ระบุ ขึ้นอยู่กับวิธีการเรียงลำดับที่เลือก |
ต่างจากวิธีการเรียงตามลำดับ คุณสามารถรวมฟังก์ชันขีดจำกัดหรือช่วงได้หลายแบบ ตัวอย่างเช่น คุณสามารถรวม queryStartingAtValue
และ queryEndingAtValue
เพื่อจำกัดผลลัพธ์ให้อยู่ในช่วงค่าที่ระบุ
จำกัดจำนวนผลลัพธ์
คุณสามารถใช้ queryLimitedToFirst
และ queryLimitedToLast
เพื่อกำหนดจำนวนชายน์สูงสุดที่จะซิงค์สำหรับการโทรกลับที่กำหนด ตัวอย่างเช่น หากคุณใช้ queryLimitedToFirst
เพื่อตั้งค่าขีดจำกัด 100 ครั้ง คุณจะได้รับการเรียกกลับ FIRDataEventTypeChildAdded
สูงสุด 100 รายการในขั้นต้นเท่านั้น หากคุณมีน้อยกว่า 100 รายการเก็บไว้ในฐานข้อมูล Firebase การเรียกกลับ 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))!
วัตถุประสงค์-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
เมื่อคุณเพิ่มบล็อกการเรียกกลับในการอ้างอิง FIRDatabaseHandle
จะถูกส่งกลับ แฮนเดิลเหล่านี้สามารถใช้เพื่อลบบล็อกการโทรกลับ
หากมีการเพิ่มผู้ฟังหลายรายในการอ้างอิงฐานข้อมูล ผู้ฟังแต่ละคนจะถูกเรียกเมื่อมีเหตุการณ์เกิดขึ้น ในการหยุดการซิงค์ข้อมูลที่ตำแหน่งนั้น คุณต้องลบผู้สังเกตการณ์ทั้งหมดที่ตำแหน่งนั้นออกโดยการเรียกเมธอด removeAllObservers
การเรียก removeObserverWithHandle
หรือ removeAllObservers
บน listener จะไม่ลบ listeners ที่ลงทะเบียนบนโหนดย่อยโดยอัตโนมัติ คุณต้องติดตามการอ้างอิงหรือหมายเลขอ้างอิงเหล่านั้นเพื่อลบออก