PracticU

שמירת מידע בדטה-בייס בענן - Firebase Database

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › שמירת מידע בדטה-בייס בענן - Firebase Database
מילון מושגים:
ענן - אספקת משאבי מחשוב כשירות דרך האינטרנט, כמו שרתים, אחסון ותוכנות, במקום להחזיק אותם מקומית.
Firebase - פלטפורמת ענן של גוגל לפיתוח אפליקציות, הכוללת מסד נתונים, אימות, אחסון ושירותים נוספים.
אחסון - שמירת נתונים באופן קבוע על התקנים כמו דיסקים או שירותי ענן, כך שיישמרו גם לאחר כיבוי.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.

שמירת מידע בדטה-בייס בענן - Firebase Database
בשיעור הקודם נבנו התחברות והרשמה. כאן לומדים לשמור ולאחזר מידע ב-Firebase Realtime Database, ולהעלות תמונות ל-Firebase Storage, על ידי בניית מסך יצירת חדר צ'אט והצגת רשימת החדרים בטבלה.
השלבים העיקריים
1. מסך יצירת חדר: מוסיפים View Controller חדש עם show segue מכפתור הפלוס, ומשייכים לו את המחלקה Create Room View Controller. בו יש Bar Button Item מסוג מצלמה, Text Field וכפתור create room בתוך Stack View אנכי, ו-Image View להצגת התמונה שנבחרה.
2. דרישות Firebase: אפשר לשמור מחרוזות, מספרים, מילונים ומערכים. אובייקט חייב להפוך למילון ובחזרה, ולכן לכל מודל צריך משתנה מחושב מסוג מילון וגם failable init שמקבל מילון.
3. מודל ChatRoom: מחלקה בקבוצה Models עם id, title, מזהה ושם הבעלים, תאריך יצירה וקישור אופציונלי לתמונה. ה-id נוצר מ-UUID, ותאריך היצירה נשמר כמחרוזת באמצעות ISO8601DateFormatter עם internet time ו-fractional seconds.
4. פרוטוקול משותף: מגדירים פרוטוקול FirebaseModel עם הדרישות האלה, ובתוך extension שלו משתנה סטטי של ה-formatter, כדי לא להעתיק קוד בין המודלים.
5. הפניה למסד הנתונים: משתנה סטטי מחושב מחזיר הפניה ל-child בשם chat rooms, כלומר node במסד. השמירה נעשית עם setValue על ילד ששמו ה-id של החדר, ועם completion block שמדווח על שגיאה או הצלחה.
6. שמירת תמונה ב-Storage: הפניה ל-Storage בנתיב chat rooms עם ה-id והסיומת jpeg. מחליפים את ה-UIImage ל-Data, מעלים עם putData, ורק אחרי הצלחה שומרים את שם הקובץ ב-imageURL ואת כל המילון במסד.
7. בחירת תמונה: UIAlertController מסוג action sheet עם camera, album ו-cancel, ו-handler אחד משותף כפונקציה בתוך פונקציה. ב-UIImagePickerController מפעילים allowsEditing, ובודקים שיש מצלמה לפני שבוחרים אותה. הסימולטור ממילא פותח את הגלריה.
8. יצירת החדר: בודקים שהכותרת לא ריקה ושהמשתמש מחובר, מציגים הודעת התקדמות ומשביתים את הכפתור כדי למנוע לחיצות כפולות. בהצלחה חוזרים למסך הקודם עם popViewController, ובכישלון מחזירים את הכפתור לפעולה.
9. טעינת הרשימה: ב-viewDidLoad מאזינים ב-observe לאירוע child added. מכל snapshot מקבלים מילון, יוצרים ממנו ChatRoom, מוסיפים למערך ומעדכנים את הטבלה עם insertRows. ב-deinit מסירים את המאזינים.
10. תא מותאם: מחלקה Room Table View Cell עם תמונה ושני labels. את התמונה טוענים מה-Storage Reference באמצעות FirebaseUI ו-SD Web Image, עם placeholder עד שהיא נטענת.
11. מעבר למסך הצ'אט: נוסף View Controller של Chat Messages עם segue בשם chat. ב-didSelectRow מבצעים performSegue, וב-prepare מעבירים אליו את החדר שנבחר.
פקודות והגדרות
- UUID().uuidString ליצירת מזהה ייחודי.
- image.jpegData עם compression quality, למשל 0.8, או 1 לאיכות מקסימלית.
- setValue לשמירה, observe לקריאה ו-removeAllObservers בעת סגירת המסך.
שימו לב
- גם putData וגם setValue מחזירים שגיאה אופציונלית ב-closure, ובתוך ה-closure צריך לכתוב self במפורש.
- בסוף אפשר לראות את הנתונים בקונסול של Firebase: ב-Realtime Database תחת chat rooms, ובקובץ התמונה ב-Storage.
אחרי השיעור אפשר לשמור אובייקטים ותמונות ב-Firebase ולטעון אותם לטבלה בזמן אמת.
השיעור הבא בקורס: בניית אפליקצית צ'אט - Chat

פרקי ההרצאה: שמירת מידע בדטה-בייס בענן - Firebase Database

  1. 00:00

    יצירת חדר ושמירתו בענן

  2. 01:18

    View Controller ליצירת חדר

  3. 04:08

    חיבור Outlets ו-Actions

  4. 05:20

    הדוקומנטציה של Realtime Database

  5. 06:57

    מודל ChatRoom עם מזהה UUID

  6. 10:22

    המרת המודל ל-Dictionary

  7. 11:36

    המרת תאריך עם ISO8601DateFormatter

  8. 13:34

    בנאי שיוצר מודל מ-Dictionary

תמלול ההרצאה: שמירת מידע בדטה-בייס בענן - Firebase Database

הטקסט המלא של הדקות הראשונות בהרצאה «שמירת מידע בדטה-בייס בענן - Firebase Database» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:20

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

  3. 00:37

    שאם אני נגיד מייצר עכשיו חדר חדר חדש נגיד נכתב כאן חדר חדש ואני אצלם פה איזושהי תמונה מהאלבום או מהמצלמה דרך אגב אני אוכל לבחור את התמונה להקטין אותה או להגדיל ואז לעשות choose אז זה החדר בעצם נתנו לו תמונה ונתנו לו כותרת ואז אם אני נלחץ פה על create room אני ארצה להציג דיאלוג

  4. 01:02

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

  5. 01:22

    הכפתור פלוס והוא מוביל אותנו לview controller של יצירת חדר אז בואו ניגש ליצירה של עוד view-controller נוסף.

  6. 01:32

    אנחנו נעשה פה פלוס view-controller וזה בעצם יהיה create-room-view-controller. אנחנו נשייך פה segue של show אז גרנטי-קונטרול-דראג-segue ואנחנו נעשה פה show-segue רגיל.

  7. 01:51

    זה בעצם יהיה המקום שבו אנחנו נייצר חדר חדש ובואו נשייך לזה את הקלאס, יש לנו כבר קלאס שיצרנו בשביל זה, אז נעמוד פה על ה-view-controller עצמו ונלך ל-identity-inspector ונשייך את הקלאס של Create Room View Controller שיוצרנו.

  8. 02:07

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

  9. 02:27

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

  10. 03:01

    הטקסט של הכפתור בצורה משמעותית נגיד בוא נעשה גודל של טקסט של 40 אוקיי עכשיו מבחינת אילוצים של כל הסטאק v אנחנו נתפוס פה את הסטאק v בצד שמאל את כל הסטאק v עצמו והאילוצים הם יהיו אילוצים סטנדרטיים 16, 16 ו-16.

  11. 03:25

    עכשיו מתחת לכל הדבר הזה אנחנו רוצים תמונה במקרה שהמשתמש שלנו בחר תמונה. כאן אנחנו ניתן placeholder של title של החדר, ומתחת לזה כל המקום שנשאר אנחנו נשים ב-image view שבו נציג את התמונה שהמשתמש בחר.

  12. 03:44

    אז פלוס image view ונוסיף לכאן image view. ומבחינת אילוצים אנחנו נרצה שהתמונה תקרא את כל מה שנשאר עם איזה שהם שוליים של 16 מכל הכיוונים, יפה.

  13. 03:58

    אז זה בעצם ה-View Controller של Create Room מבחינת UI, בואו נחבר Outlets וכן הלאה ונראה איך אנחנו יכולים אחר כך באמת למלא שם צדוק. כרגע נוציא Outlets, אז אני אעמוד פה על נגיד טקסט פילד, נפתח את ה-סיסטמנט אדיטור, נפתח לי כבר ב-Chat Room View Control, ב-Create Room View Controller, מצוין, אז אני רוצה להוציא אקשן לכפתור,

  14. 04:27

    נקרא לזה Take Photo, טייט רצוי שהוא יהיה UI בטון, כבר בטון אייטל וקונקט. מבחינת הטקסט פילד אז נוציא Outlet, נקרא לזה Title טקסט פילד ומבחינת הכפתור אז יש לנו אקשן של קריאייט רום, נוריד את זה גם לפה קריאייט רום, שוב פעם הטיפוס רצוי שהוא יהיה UI בטון ומה עוד יש לנו את ה-Image View של התמונה,

  15. 04:59

    אז נוציא Outlet ל-Image View של התמונה, נקרא לזה Room Image View טוב אז עכשיו בעצם כשהוצאנו האוטלטים כרגיל לטקסט פילד ולאימג' ויו ויוצאנו אקשנים לכפתור ולברבטון אייטם, נשאלת השאלה איך אנחנו יכולים עכשיו לייצר בעצם מודל שלנו ולשמור אותו

  16. 05:20

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

  17. 05:42

    איי-או-אס אתם יכולים למצוא את כל מה שאתם מתעניינים בו והפעם אנחנו מתעניינים ברילטיים דאטאבייס וברילטיים דאטאבייס באיי-או-אס כמובן וגטינג סטארטד או בוא נלך פה ל-read and dry data כי אנחנו נעבור ביחד את השלבים של גטינג סטארטד ב-read and dry data אומרים לנו בעצם אתם רוצים רפרנס לדאטאבייס אז אז

  18. 06:03

    database.database.reference זה גישה לדאטאבייס, לאובייקט של הדאטאבייס. עכשיו, מעבר לגישה לאובייקט של הדאטאבייס, מה אנחנו רוצים לשמור? מה אנחנו יכולים לשמור?

  19. 06:14

    אנחנו יכולים לשמור או סטרינגים או מספרים או dictionaries או arrays, אוקיי? אנחנו לא יכולים לשמור איזה אובייקט שאנחנו רוצים, אלא אם כן נמיר אותו להיות כדיקשנרי או כ-array.

  20. 06:26

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

  21. 06:50

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

  22. 07:06

    אחת אנחנו חזרה ל-Xcode, הבנו את הרעיון הכללי. אנחנו נרצה לייצר בפרויקט שלנו גרופ חדש לכל המודלים, אז תחת הגרופ של ה-FileChat אנחנו נעשה New Group חדש, נקרא לזה Models, ותחת מודלים אנחנו נרצה לייצר אצלנו מודל של ChatRoom, אז New File,

  23. 07:28

    Swift File, ונקרא לזה ChatRoom.swift. עכשיו, אנחנו באיזשהו שלב אנחנו נרצה לעבוד פה גם עם אימג'ים וכן הלאה אבל בואו נשנה פה את האימפורט ל...

  24. 07:47

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

  25. 08:20

    לחדר יש אונר מי יצר אותו מהיוזר איידי של האונר, לחדר יהיה לנו גם את האונר name כדי שיהיה לנו קל לזהות במקום לקבל רק איידי אנחנו נרצה גם איך קוראים לבעל החדר, מעבר לזה אנחנו נרצה תאריך יצירה אז created add הוא יהיה date ויהיה לנו משתנה אופציונלי של אימאג' קישור לתמונה זה יהיה סטרינג אבל הוא יהיה

  26. 08:54

    אופציונל. עכשיו בגלל שיצרנו קלאס אז אנחנו צריכים בניין, אנחנו נייצר בנאי רגיל כמו בכל קלאס רגיל אז יש לנו את ה-id אנחנו לא צריכים תכף אני אראה לכם מה אנחנו עושים איתו, יהיה לנו את ה-title אבל את ה-honor-id שהוא string ויהיה לנו את ה-honor-name שהוא גם כן string.

  27. 09:14

    לגבי ה-id של החדר אנחנו פשוט נייצר id חדש, id יהיה שווה ל-uuid חדש שזה Universal Unique Identifier בעצם אני נותן לסוויפט להמציא לי איזשהו id יוניקי לגמרי לחדר אנחנו עושים את זה על ידי יצירת מופע של uuid ואנחנו רוצים את ה-uuid-string אז הנה יש לנו ID לחדר וזה Unique Identifier לכל מופע יהיה מזהה ייחודי לגמרי משל

  28. 09:39

    עצמו. מעבר לזה אז ה-Title זה לא בעיה: Self.Title שווה ל-Title, Self.HonorID שווה ל-HonorID ו-Self.HonorName אותו סיפור.

  29. 09:56

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

  30. 10:14

    אז בוודאי רגיל למודל שלנו, אולי מעניין פה הקטע עם ה-unique identifier לחדר, אז הוספנו פה את העניין הזה. עכשיו, מה לגבי Firebase? Firebase בעצם רוצה מאיתנו שנהיה מסוגלים להפוך Chat Room לדיקשנרי ובחזרה.

  31. 10:29

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

  32. 10:41

    הדיקשנרי שלנו יהיה מילון, ובמילון אנחנו נשים את כל התכונות ID יהיה שווה לself.id Title self.title רק את זה צריך לשים כמובן במרכאות אוקיי אנחנו בונים Dictionary וככה אנחנו בעצם יכולים לעשות סיריליזציה Owner ID ונשים פה את ה-Owner ID ו-Owner Name אותו סיפור עכשיו בסוף אנחנו נרצה גם

  33. 11:15

    להחזיר את ה-Dictionary הזה אז אנחנו עושים Return דבר אחרון פה באמצע יש לנו גם את ה-Created Add וה-Created Add צריך לחשוב איך לוקחים Date to String ויש לנו את ה-OptionalImage אז לגבי ה-OptionalImage אנחנו נגיד אם יש תמונה אז נשמור אותה בדיקשנר

  34. 11:37

    E-flat-imageURL שווה ל-imageURL שלנו רק אז אנחנו רוצים להוסיף אותה למילון אז dictionary במקום ה-imageURL שווה ל-imageURL אוקיי מה לגבי המרה של דייט לסטרינג כאן אנחנו נרצה להשתמש באיזשהו דייט פורמטר אנחנו נשתמש ב-ISO 8601 פורמטר בצורה הבאה let formatter שווה ל-ISO 8601 date formatter חדש

  35. 12:12

    ועל הפורמטר אנחנו נרצה לבחור ב-options בפורמט אופצ'יינס של אינטרנט טיים ובנוסף אנחנו רוצים שהוא יכלול לחלקי שנייה אז with fractional second אוקיי אז הנה יש לנו את הפורמטר ובעזרת הפורמטר כמובן שאפשר להמיר תאריכים לסטרינגים אז פורמטר נקודה דייט פרום סטרינג וסטרינג פרום דייט במקרה שלנו סטרינג פרום דייט

  36. 12:41

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

  37. 13:08

    רגיל ולהפוך אותו להיות דיקשונרי אוקיי בעצם לעשות לו סריאליזציה לדיקשונרי שזה הדרישה הראשונה של פיירבייס מאיתנו. סריאליז our object to dictionary וזה הנדרש על ידי פיירבייס אוקיי פיירבייס רוצה שאנחנו נשמור את הדברים שלנו כדיקשונרי עכשיו אנחנו צריכים גם להיות מסוגלים לעשות את התהליך ההפוך מה שעשינו פה נועד לשמירת מידע

  38. 13:36

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

  39. 14:04

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

  40. 14:19

    אז גארד let ID שווה לדיקשנרי במקום ה-ID, let Title שווה דיקשנרי במקום ה-Title,

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: הסבר על Firebase Auth - יצירת משתמשים והתחברות לאפלקציה

ההרצאה הבאה: בניית אפליקצית צ'אט - Chat

הרצאות קשורות מקורסים אחרים

  • שמירת מידע בטלפון - Storage
  • שמירת מידע בקובץ JSON - קורס NodeJS
  • סיכום פרק Azure Database
  • ריאקט - עדכון של Firebase

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון