עבודה עם רשימות נתונים

קבל הפניה למסד נתונים

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

DatabaseReference ref = FirebaseDatabase.instance.ref();

קריאה וכתיבה של רשימות

הוסף לרשימת נתונים

השתמש בשיטת push() כדי להוסיף נתונים לרשימה ביישומים מרובי משתמשים. שיטת push() מייצרת מפתח ייחודי בכל פעם שילד חדש מתווסף להפניה שצוינה ב-Firebase. על ידי שימוש במפתחות אלה שנוצרו אוטומטית עבור כל רכיב חדש ברשימה, מספר לקוחות יכולים להוסיף ילדים לאותו מיקום בו-זמנית ללא התנגשויות כתיבה. המפתח הייחודי שנוצר על ידי push() מבוסס על חותמת זמן, ולכן פריטי רשימה מסודרים באופן אוטומטי באופן כרונולוגי.

אתה יכול להשתמש בהפניה לנתונים החדשים המוחזרים על ידי שיטת push() כדי לקבל את הערך של המפתח שנוצר אוטומטית של הילד או להגדיר נתונים עבור הילד. המאפיין .key של הפניה push() מכיל את המפתח שנוצר אוטומטית.

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

לדוגמה, ניתן להשתמש push() כדי להוסיף פוסט חדש לרשימת פוסטים באפליקציה חברתית:

DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
  // ...
});

האזינו לאירועי ילדים

אירועי צאצא מופעלים בתגובה לפעולות ספציפיות שקורות לילדים של צומת מפעולה כגון ילד חדש שנוסף באמצעות שיטת push() או ילד המתעדכן באמצעות שיטת update() .

מִקרֶה שימוש אופייני
onChildAdded אחזר רשימות של פריטים או האזן לתוספות לרשימת פריטים. אירוע זה מופעל פעם אחת עבור כל ילד קיים ולאחר מכן שוב בכל פעם שילד חדש נוסף לנתיב שצוין. למאזין מועברת תמונת מצב המכילה את הנתונים של הילד החדש.
onChildChanged האזן לשינויים בפריטים ברשימה. אירוע זה מופעל בכל פעם שצומת צאצא משתנה. זה כולל שינויים כלשהם בצאצאים של צומת הילד. תמונת המצב שהועברה למאזין האירועים מכילה את הנתונים המעודכנים עבור הילד.
onChildRemoved האזן לפריטים שהוסרו מרשימה. אירוע זה מופעל כאשר ילד מיידי מוסר. תמונת המצב המועברת לחסימה להתקשרות חוזרת מכילה את הנתונים עבור הילד שהוסר.
onChildMoved האזן לשינויים בסדר הפריטים ברשימה מסודרת. אירועי onChildMoved תמיד עוקבים אחר אירוע onChildChanged שגרם לשינוי ההזמנה של הפריט (בהתבסס על השיטה הנוכחית שלך לפי הזמנה).

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

final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
  // A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
  // A comment has changed; use the key to determine if we are displaying this
  // comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
  // A comment has been removed; use the key to determine if we are displaying
  // this comment and if so remove it.
});

הקשיבו לאירועים ערכיים

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

הצמדת מאזין value לרשימת נתונים תחזיר את כל רשימת הנתונים כתמונת מצב בודדת שאותה תוכל לאחר מכן לעבור בלולאה כדי לגשת לילדים בודדים.

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

myTopPostsQuery.onValue.listen((event) {
  for (final child in event.snapshot.children) {
    // Handle the post.
  }
}, onError: (error) {
  // Error.
});

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

מיון וסינון נתונים

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

מיון נתונים

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

שיטה נוֹהָג
orderByChild() סדר את התוצאות לפי הערך של מפתח צאצא או נתיב צאצא מקונן.
orderByKey() הזמנת תוצאות לפי מפתחות ילדים.
orderByValue() סדר תוצאות לפי ערכי צאצא.

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

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

final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
    .ref("user-posts/$myUserId")
    .orderByChild("starCount");

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

הקריאה למתודה orderByChild() מציינת את מפתח הילד לפיו יש לסדר את התוצאות. במקרה זה, הפוסטים ממוינים לפי הערך של הילד "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 על ידי ציון הנתיב היחסי לילד המקונן בקריאה שלנו orderByChild() .

final mostViewedPosts =
    FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');

למידע נוסף על אופן הסדר של סוגי נתונים אחרים, ראה כיצד מסודרים נתוני שאילתה .

סינון נתונים

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

שיטה נוֹהָג
limitToFirst() מגדיר את המספר המרבי של פריטים להחזרה מתחילת רשימת התוצאות המסומנת.
limitToLast() מגדיר את המספר המרבי של פריטים להחזרה מסוף רשימת התוצאות שהוזמנה.
startAt() החזר פריטים הגדולים או שווה למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.
startAfter() החזר פריטים הגדולים מהמפתח או מהערך שצוינו בהתאם לשיטת ההזמנה לפי בחירה.
endAt() החזר פריטים הנמוכים או שווים למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.
endBefore() החזר פריטים הנמוכים מהמפתח או הערך שצוינו בהתאם לשיטה לפי הזמנה שנבחרה.
equalTo() החזר פריטים השווים למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.

שלא כמו שיטות הסדר לפי, אתה יכול לשלב מספר פונקציות הגבלה או טווח. לדוגמה, ניתן לשלב את המתודות startAt() ו- endAt() כדי להגביל את התוצאות לטווח מוגדר של ערכים.

הגבל את מספר התוצאות

אתה יכול להשתמש בשיטות limitToFirst() ו- limitToLast() כדי להגדיר מספר מקסימלי של ילדים שיסונכרנו עבור אירוע נתון. לדוגמה, אם אתה משתמש limitToFirst() כדי להגדיר מגבלה של 100, אתה מקבל בהתחלה רק עד 100 אירועים onChildAdded . אם יש לך פחות מ-100 פריטים המאוחסנים במסד הנתונים שלך ב-Firebase, אירוע onChildAdded מופעל עבור כל פריט.

כאשר פריטים משתנים, אתה מקבל אירועים onChildAdded עבור פריטים שנכנסים לשאילתה ואירועי onChildRemoved עבור פריטים שנפלטים ממנה כך שהמספר הכולל נשאר על 100.

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

final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);

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

סנן לפי מפתח או ערך

אתה יכול להשתמש startAt() , startAfter() , endAt() , endBefore() ו- equalTo() כדי לבחור נקודות התחלה, סיום ושקילות שרירותיות עבור שאילתות. זה יכול להיות שימושי עבור עימוד נתונים או מציאת פריטים עם ילדים בעלי ערך ספציפי.

כיצד מסודרים נתוני שאילתה

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

orderByChild

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

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

orderByKey

בעת שימוש orderByKey() למיון הנתונים שלך, הנתונים מוחזרים בסדר עולה לפי מפתח.

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

orderByValue

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

לנתק מאזינים

התקשרויות חוזרות מוסרות על ידי קריאה לשיטה off() בהפניה למסד הנתונים שלך ב-Firebase.

אתה יכול להסיר מאזין בודד על ידי העברתו כפרמטר ל- off() . קריאת off() במיקום ללא ארגומנטים מסירה את כל המאזינים במיקום זה.

קריאת off() במאזין אב אינה מסירה אוטומטית מאזינים הרשומים בצמתי הצאצא שלו; off() חייב להיקרא גם על כל מאזיני ילדים כדי להסיר את ההתקשרות חזרה.

הצעדים הבאים