עבודה עם רשימות נתונים בפלטפורמות של אפל

קבל FIRDatabaseReference

כדי לקרוא או לכתוב נתונים ממסד הנתונים, אתה צריך מופע של FIRDatabaseReference :

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
@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 .

כל אחד מהם ביחד יכול להיות שימושי להאזנה לשינויים בצומת ספציפי במסד נתונים. לדוגמה, אפליקציית בלוגים חברתית עשויה להשתמש בשיטות אלה יחד כדי לנטר את הפעילות בהערות של פוסט, כפי שמוצג להלן:

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// 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

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// 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 יחידה, שאותה תוכל לאחר מכן לעבור בלולאה כדי לגשת לילדים בודדים.

גם כאשר יש רק התאמה בודדת לשאילתה, תמונת המצב היא עדיין רשימה; הוא מכיל רק פריט בודד. כדי לגשת לפריט, עליך לעבור בלולאה על התוצאה:

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
[_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 סדר את התוצאות לפי הערך של מפתח צאצא או נתיב צאצא מקונן.

אתה יכול להשתמש רק בשיטה אחת לפי הזמנה בכל פעם. קריאה לשיטה לפי סדר מספר פעמים באותה שאילתה זורקת שגיאה.

הדוגמה הבאה מדגימה כיצד תוכל לאחזר רשימה של הפוסטים המובילים של משתמש ממוינת לפי ספירת הכוכבים שלו:

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// 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 .

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
 
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 הפוסטים האחרונים של כל המשתמשים:

מָהִיר

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// 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

הערה: מוצר Firebase זה אינו זמין ביעד App Clip.
// 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 למיון הנתונים שלך, הנתונים מוחזרים בסדר עולה לפי מפתח.

  1. ילדים עם מפתח שניתן לנתח כמספר שלם של 32 סיביות מגיעים ראשונים, ממוינים בסדר עולה.
  2. ילדים עם ערך מחרוזת כמפתח מגיעים אחר כך, ממוינים בלקסיוגרפית בסדר עולה.

queryOrderedByValue

בעת שימוש queryOrderedByValue , ילדים מסודרים לפי הערך שלהם. קריטריוני ההזמנה זהים לאלו ב- queryOrderedByChild , אלא שהערך של הצומת משמש במקום הערך של מפתח צאצא שצוין.

queryOrderedByChild

בעת שימוש queryOrderedByChild , הנתונים המכילים את מפתח הצאצא שצוין מסודרים באופן הבא:

  1. ילדים עם ערך nil עבור מפתח הצאצא שצוין קודמים.
  2. ילדים עם הערך של false עבור מפתח הצאצא שצוין מגיעים לאחר מכן. אם למספר ילדים יש ערך של false , הם ממוינים בלקסיקוגרפית לפי מפתח.
  3. ילדים עם הערך של true עבור מפתח הצאצא שצוין מגיעים לאחר מכן. אם למספר ילדים יש ערך של true , הם ממוינים בלקסיקוגרפית לפי מפתח.
  4. ילדים עם ערך מספרי מגיעים אחר כך, ממוינים בסדר עולה. אם למספר ילדים יש ערך מספרי זהה עבור צומת הצאצא שצוין, הם ממוינים לפי מפתח.
  5. מחרוזות באות אחרי מספרים וממוינות לקסיקוגרפית בסדר עולה. אם למספר ילדים יש ערך זהה עבור צומת הילד שצוין, הם מסודרים בלקסיקוגרפית לפי מפתח.
  6. אובייקטים מגיעים אחרונים וממוינים לקסיקוגרפית לפי מפתח בסדר עולה.

לנתק מאזינים

צופים לא מפסיקים אוטומטית לסנכרן נתונים כאשר אתה עוזב ViewController . אם צופה לא מוסר כראוי, הוא ממשיך לסנכרן נתונים לזיכרון המקומי וישמור את כל האובייקטים שנלכדו בסגירת המטפל באירועים, מה שעלול לגרום לדליפות זיכרון. כאשר אין עוד צורך בצופה, הסר אותו על ידי העברת FIRDatabaseHandle המשויך לשיטת removeObserverWithHandle .

כאשר אתה מוסיף בלוק התקשרות חזרה להפניה, מוחזר FIRDatabaseHandle . ניתן להשתמש בידיות אלה כדי להסיר את חסימת ההתקשרות חזרה.

אם נוספו מספר מאזינים להפניה למסד נתונים, כל מאזין נקרא כאשר אירוע מועלה. על מנת להפסיק את סנכרון הנתונים במיקום זה, עליך להסיר את כל הצופים במיקום על ידי קריאה לשיטת removeAllObservers .

קריאה ל- removeObserverWithHandle או removeAllObservers במאזין אינה מסירה אוטומטית מאזינים הרשומים בצמתי הצאצא שלו; עליך גם לעקוב אחר ההפניות או האחיזה כדי להסיר אותם.

הצעדים הבאים