קבל FIRDatabaseReference
כדי לקרוא או לכתוב נתונים ממסד הנתונים, אתה צריך מופע של FIRDatabaseReference
:
מָהִיר
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 | אחזר רשימות של פריטים או האזן לתוספות לרשימת פריטים. אירוע זה מופעל פעם אחת עבור כל ילד קיים ולאחר מכן שוב בכל פעם שילד חדש נוסף לנתיב שצוין. למאזין מועברת תמונת מצב המכילה את הנתונים של הילד החדש. |
FIRDataEventTypeChildChanged | האזן לשינויים בפריטים ברשימה. אירוע זה מופעל בכל פעם שצומת צאצא משתנה. זה כולל שינויים כלשהם בצאצאים של צומת הילד. תמונת המצב שהועברה למאזין האירועים מכילה את הנתונים המעודכנים עבור הילד. |
FIRDataEventTypeChildRemoved | האזן לפריטים שהוסרו מרשימה. אירוע זה מופעל כאשר ילד מיידי מוסר. תמונת המצב המועברת לחסימה להתקשרות חוזרת מכילה את הנתונים עבור הילד שהוסר. |
FIRDataEventTypeChildMoved | האזן לשינויים בסדר הפריטים ברשימה מסודרת. אירוע זה מופעל בכל פעם שעדכון גורם לסדר מחדש של הילד. הוא משמש עם נתונים שמסודרים לפי queryOrderedByChild או queryOrderedByValue . |
כל אחד מהם ביחד יכול להיות שימושי להאזנה לשינויים בצומת ספציפי במסד נתונים. לדוגמה, אפליקציית בלוגים חברתית עשויה להשתמש בשיטות אלה יחד כדי לנטר את הפעילות בהערות של פוסט, כפי שמוצג להלן:
מָהִיר
// 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 יחידה, שאותה תוכל לאחר מכן לעבור בלולאה כדי לגשת לילדים בודדים.
גם כאשר יש רק התאמה בודדת לשאילתה, תמונת המצב היא עדיין רשימה; הוא מכיל רק פריט בודד. כדי לגשת לפריט, עליך לעבור בלולאה על התוצאה:
מָהִיר
_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 | סדר את התוצאות לפי הערך של מפתח צאצא או נתיב צאצא מקונן. |
אתה יכול להשתמש רק בשיטה אחת לפי הזמנה בכל פעם. קריאה לשיטה לפי סדר מספר פעמים באותה שאילתה זורקת שגיאה.
הדוגמה הבאה מדגימה כיצד תוכל לאחזר רשימה של הפוסטים המובילים של משתמש ממוינת לפי ספירת הכוכבים שלו:
מָהִיר
// 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"];
שאילתה זו מאחזרת את הפוסטים של המשתמש מהנתיב במסד הנתונים על סמך מזהה המשתמש שלו, לפי מספר הכוכבים שכל פוסט קיבל. טכניקה זו של שימוש במזהים כמפתחות אינדקס נקראת יציאת נתונים, תוכל לקרוא עליה עוד ב- Structure Your Database .
הקריאה לשיטת 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
.
מָהִיר
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
כדי להגדיר מספר מקסימלי של ילדים שיסונכרנו עבור התקשרות חוזרת נתונה. לדוגמה, אם אתה משתמש queryLimitedToFirst
כדי להגדיר מגבלה של 100, אתה מקבל בתחילה רק עד 100 התקשרויות חוזרות FIRDataEventTypeChildAdded
. אם יש לך פחות מ-100 פריטים המאוחסנים במסד הנתונים שלך ב-Firebase, יופעל התקשרות חוזרת FIRDataEventTypeChildAdded
עבור כל פריט.
כאשר פריטים משתנים, אתה מקבל התקשרות חוזרת FIRDataEventTypeChildAdded
עבור פריטים שנכנסים לשאילתה ו- FIRDataEventTypeChildRemoved
callbacks עבור פריטים שנפלטים ממנה כך שהמספר הכולל נשאר על 100.
הדוגמה הבאה מדגימה כיצד אפליקציית בלוגים לדוגמה עשויה לאחזר רשימה של 100 הפוסטים האחרונים של כל המשתמשים:
מָהִיר
// 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
.
כאשר אתה מוסיף בלוק התקשרות חזרה להפניה, מוחזר FIRDatabaseHandle
. ניתן להשתמש בידיות אלה כדי להסיר את חסימת ההתקשרות חזרה.
אם נוספו מספר מאזינים להפניה למסד נתונים, כל מאזין נקרא כאשר אירוע מועלה. על מנת להפסיק את סנכרון הנתונים במיקום זה, עליך להסיר את כל הצופים במיקום על ידי קריאה לשיטת removeAllObservers
.
קריאה ל- removeObserverWithHandle
או removeAllObservers
במאזין אינה מסירה אוטומטית מאזינים הרשומים בצמתי הצאצא שלו; עליך גם לעקוב אחר הפניות או נקודות אחיזה כדי להסיר אותן.