
xcdatamodeld שבו מגדירים ישויות (Entities) ותכונות. בדוגמה הישות Person כוללת שם פרטי, שם משפחה, תאריך יצירה ו-gender מסוג בוליאני. אפשר לקבוע לכל תכונה אם היא אופציונלית.NSManagedObject וחיים בתוך ה-Context. כששומרים את ה-Context, כל האובייקטים נכתבים לדיסק.NSEntityDescription לפי שם הישות, יוצרים אובייקט מנוהל, קובעים לו ערכים עם setValue(forKey:) ושומרים את ה-Context עם save בתוך do/try/catch.NSFetchRequest ומריצים אותו מול ה-Context. מקבלים מערך של אובייקטים מנוהלים, ושולפים מהם ערכים עם value(forKey:) וביצוע cast.saveContext. אפשר להגיע אליו מכל מקום עם UIApplication.shared.delegate.description, תכונה מחושבת fullName ו-convenience init. את ה-Extension לא נוגעים כי הוא ייווצר מחדש.shared ובנאי private. הוא שייך לקבוצת ה-Models ולא ל-View Controllers, כדי לשמור על MVC.DateFormatter ביחסי זמן (למשל "היום"), וה-gender מוצג כ-male או female.commit editingStyle מוחקים עם context.delete, שומרים ומסירים את הפריט מהמערך.lazy var עם request ו-sort descriptors, מפעילים performFetch וממשים את ה-delegate עבור insert, update, move ו-delete.persistentContainer.viewContext הוא ה-Context של האפליקציה.NSSortDescriptor לפי lastName ואז firstName ממיין את התוצאות מראש.tableView.beginUpdates() ו-endUpdates() עוטפים את העדכונים הפרטניים.insertRows, deleteRows ו-moveRow.setValue חייבים להיות זהים לכתוב ב-Data Model.Date ולא Data.tableView.window הוא nil כפתרון, אך באפליקציה הזו האזהרה לא משפיעה.הטקסט המלא של הדקות הראשונות בהרצאה «דטה בייס מקומי לאפליקציה תוך שימוש במערכת CoreData» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום אורחים הבאים אנחנו רוצים להכיר את core data שהיא מערכת לשמירת מידע בטלפון המקומי של המשתמש בדומה לדאטאבייסים. אלא שלעומת דאטאבייס core data היא למעשה מערכת לניהול אובייקטים ולכן היא יותר נוחה מאשר שימוש בדאטאבייס בשימוש בדאטאבייס אנחנו נאלצים להכיר מושגים כמו טבלאות ומושגים
שהם בעצם לא נלקחים מעולם פיתוח האפליקציות אלא מעולם הדאטאבייסים ו-core data היא מערכת שבה נגשר על הפער הזה, ובעצם לתת לנו לעבוד עם טים ולשמור אותם על ידי מערכת הניהול של האובייקטים שמציעה לנו core data.
אז core data היא בעצם מערכת לניהול אובייקטים. חשוב לציין שהמידע נשמר לוקאלית בטלפון של המשתמש, זה לא דאטה בייס בענן.
אנחנו נדבר בהמשך גם על דאטה בייסים בענן, אבל במודול הזה של core data אנחנו בעצם רוצים ללמוד על מערכת לניהול אובייקטים פנימית בתוך המכשיר.
Core Data בעצם מאפשרת לנו לשמור ולאחזר אובייקטים שלנו. הם לא בדיוק אובייקטים שלנו, אלא הם אובייקטים שמנוהלים על ידי ה-DataBase, ואנחנו נסתכל על המושגים הרלוונטיים.
בנוסף, המערכת היא מאוד מאוד יעילה והיא מאוד נוחה ומודרנית, אז אנחנו נרצה להשתמש בה ולא להשתמש באלטרנטיבות שהן יותר Low-Level, לדוגמה SQLite.
Core Data הרבה פעמים משתמשת ב-SQLite, שזה DataBase פשוט מאחורי הקלעים, אבל היא מנגישה לנו את הדאטאבייס הזה תוך שימוש במימוש מאוד מאוד נחמד ויעיל ונוח של אובייקטים.
אז core data בעצם מגשרת לנו על הפער של לייצר דאטאבייס. אם עבדתם בעבר מול דאטאבייסים אז אתם יודעים שיש לכם בעצם כל מיני מושגים שאתם צריכים להכיר שהם רלוונטיים לדאטאבייסים בלבד.
core data מגשרת על זה ונותנת לנו לעבוד עם אובייקטים מנוהלים. אנחנו נרצה להכיר קצת מושגים לפני שנצא לדרך לאקסקוד, בואו נלמד קצת על מושגים ובכלל איך זה אמור להיראות בתוך אקסט קוד ברגע שאנחנו יוצרים פרויקט שתומך בקור דאטה אנחנו נקבל בעצם קובץ שנקרא דאטה מודל וקובץ הזה שנקרא דאטה מודל מאפשר לי להגדיר ישויות או טבלאות או איך שתרצו לקרוא לזה בעולם של דאטה בייסים
קוראים להם אנטיטיס או ישויות עכשיו אנטיטי הוא דומה לטבלה אם אתם רוצים לחשוב על זה ככה של אובייקטים עכשיו בטבלה של אובייקטים אנחנו נגדיר את כל התכונות של נגיד פרסון אז אתם יכולים לראות פה בדוגמה שלפניכם שהגדרתי פה גיל שם פרטי ושם משפחה אבל כמובן שהזהות של
הדברים שאתם רוצים לשמור תלויה רק בכם אז מושג ראשון הדאטה מודל מושגים נוספים אובייקטים אמרתי אובייקטים מנוהלים מי מנהל את האובייקטים core data נכון עכשיו איך core data מנהלת את האובייקטים core data מה נקרא לנו קודם כל קלאס שנקרא NSManagedObject וזה הקלאס של האובייקט המנוהל.
דבר שני, האובייקטים המנוהלים נשמרים תחת אובייקט נוסף שנקרא קונטקסט, וכמו שאתם יכולים לראות פה בציור הזה שלפניכם, כאן, אז בעצם יש לנו את הקונטקסט עצמו שצבוע בכחול, ובתוך הקונטקסט חיים האובייקטים.
ברגע שאני סוגר את הקונטקסט או שאני שומר את הקונטקסט, אז באותו רגע כל האובייקטים נשמרים לדיסק. ברגע שאנחנו נסגור את האפליקציה אנחנו נדאג לשמור את הקונטקסט וככה כל האובייקטים יישמרו לדיסק.
כלומר אובייקטים הם לא חיים לבדם, הם מנוהלים תחת הקונטקסט. הציור הכחול פה, הצבע הכחול, מנסה להגיד לכם שאובייקטים נמצאים תחת קונטקסט ונשמרים לקונטקסט וברגע שאני שומר את הקונטקסט האובייקטים נשמרים לדיסק.
אז למדנו פה שני מושגים בשקף הזה אובייקטים מנוהלים והקונטקסט. אנחנו עוד מעט ניכנס לאקסקוד ונראה את הדברים ככה בקוד, אבל אני רוצה שתנסו לחשוב רגע על המושגים כדי שהקוד יהיה לכם יותר נהיר וברור.
עוד טיפה מושגים, כדי לשמור מידע אנחנו בעצם רוצים ליצור מופע של אובייקט מנוהל, כמו שראינו פה, אובייקטים מנוהלים זה מה שאנחנו שומרים בדאטאבייס.
כדי לשמור מופע של אובייקט מנוהל אנחנו נצטרך לעשות איזשהו שימוש בקלאס שנקרא NS Entity Description, שבעצם נותן את השם של המחלקה, וברגע שיש לנו NS Entity Description נוכל לייצר אובייקט מנוהל, לתת לו את התכונות שלו ולשמור את הקונטקסט.
ברגע ששומרים את הקונטקסט כל האובייקטים נשמרים לדיסק. אתם לא צריכים להבין כרגע את הקוד הזה, אני רק מנסה להכיר את המושגים לפני שאני אלך לתכנך אותם.
דבר אחרון, כשמאחזרים מידע, אז אנחנו בעצם מייצרים הופעה של NS Fetch Request ואת הבקשה, זה בעצם בקשה לשאילתא של החזור מידע, ואת הבקשה לשאילתה לחזור מידע אנחנו פשוט נרצה אחר כך להריץ מול הקונטקסט.
אז אנחנו נריץ את הבקשה הזאת תחת הקונטקסט, קונטקסט הריץ לי בקשת שאילתה, וברגע שאני עושה שאילתה אני אקבל בחזרה את האובייקטים המנואליים. אז זה כל מה שרציתי להגיד לכם מבחינה תיאורטית, אבל בטח שזה נשמע בטח אולי כמו סינית, אז בואו נקפוץ שנייה ל-Xcode ונראה במה דברים אמורים.
אוי, עוד דבר אחד אחרון, קמפלייט של core data אנחנו עושים שימוש ב-app delegate וה-app delegate הוא בעצם אובייקט משותף לכל אפליקציות של iOS אז לכן היה נוח לאפל להשתמש בו בגלל שזה אובייקט משותף למעשה כמו סינגלטון שמשותף ואפשר להגיע אליו מכל מקום באפליקציה אז בפרויקט הזה אנחנו גם נרצה ללמוד
על הנושא הזה של ה-app delegate ואיך משתמשים בו ומה הוא נותן לנו זהו אז זה היה המבוא בואו נקפוץ ל-Xcode וננסה ככה לראות את הדברים בצורה פרקטית אז אני קופץ שנייה ל-Xcode אנחנו נייצר לעצמנו פרויקט חדש, נגדיל פה את המסך ואנחנו רוצים לייצר סינגל
ו-אפליקיישן, אבל אנחנו רוצים להוסיף את ה-V הזה של Use Core Data. Use Core Data נקרא לפרויקט שלנו Core Data Demos, אוקיי, וכאן אנחנו בעצם נרצה ללמוד על Core Data ואנחנו נעשה Next.
היה חשוב לצמן את ה-Use Core Data. למקרה שאתם שואלים את עצמכם, אז CloudKit היא בעצם מערכת נוספת של אפל שמאפשרת לכם לשמור את המידע הזה גם בענן לצערי המערכת הזאת לא מושלמת עד הסוף ויש איתה המון המון דיליים בתאנה של המידע וכן הלאה ולכן אני לא ממש ממליץ לכם לעשות use cloud kit ולהשתמש ב-cloud kit
זה נכנס רק בגרסה האחרונה של iOS וזה עדיין קצת מקרטע זה לא עובד יפה כמו דאטה בייסים אחרים אז אנחנו נרצה להכיר דאטה בייסים בענן אבל עם כל הכבוד לאפל בשלב הזה אני לא אמליץ על cloud kit לצערי והייתי מאוד שמח כן להמליץ, כי זה מאוד מאוד פשוט להשתמש ב-CloudKit, אבל כמו שאמרתי, זה לא אמין מספיק כדי שאני
אוכל להמליץ לכם על זה. אז רק use core data. טוב. אז יצרנו פרויקט, נכון? מה חדש בפרויקט הזה? למה עשינו את ה-checkbooks על use core data?
מה שחדש בפרויקט הזה זה שבאמת יש לנו פה את הדאטה מודל שראינו אותה בשקופית, ואמרנו שהדאטה מודל נותן לנו מקום להגדיר את הישויות שלנו, להגדיר את הטבלאות שלנו.
כאן בעצם אנחנו רוצים להגדיר ישויות. איך עושים את זה? אנחנו נלחץ פה על Add Entity למטה בפלוס, אתם רואים את הפלוס כאן למטה, אז אנחנו נלחץ עליו, וברגע שלחצתי אז יש לי פה את ההגדרה של האנטיטי בצד שמאל בכחול, היא כחולה, אני אלחץ על זה בדאבל קליק ובמקום אנטיטי בוא
נקרא לזה פרסון, ועכשיו אנחנו ניגש לתכונות של פרסון. אז אני עושה פה פשוט פלוס ונגיד שלפרסון החלטנו שיהיה first name, הוא יהיה סטרינג, אז הטיפוס שלו יהיה סטרינג ואותו דבר אנחנו נרצה להגדיר נניח גם last name וגם זה יהיה סטרינג בוא נגדיר לנו איזושהי תכונה של תאריך
created at והדבר הזה יכול להיות תאריך ואנחנו יכולים להגדיר נגיד גם גיל הפרסון למרות שזה עדיף שזה יהיה נגזרת של התאריך אז בואו לא נעשה את הדבר הזה אוקיי ניצור כאן אלה התכונות של פרסון שאנחנו רוצים אולי נוסיף ג'נדר שזה יהיה בוליאני כדי שנראה עוד דברים אז אני מגדיר את ג'נדר להיות בוליאן טוב עכשיו כל התכונות האלה יכולות להיות אופצ'ונל או
לא אופצ'ונל, אז אפשר להוריד או להחזיר את האופצ'ונל, אם אתם רוצים, אופצ'ונל סטרינג, אופצ'ונל אינטג'ר, אופצ'ונל כל דבר, אופצ'ונל תאריך, ואפילו אפשר לתת דרך אגב ברירת מחדל וכאלה, אבל אפשר לעשות את זה גם מהכל.
טוב, אז כאן אנחנו מגדירים את הישויות שלנו, בסדר? זה אקסידת המודל או הדאטה מודל, המודל שלנו. הוא למעשה מייצג איזה ישויות יש לנו, בדאטאבייסים איזה אישויות אתם רוצים לייצג עכשיו לצורך הדוגמה הראשונה שלנו אנחנו נרצה לעמוד על האנטיטי של פרסון ואנחנו רוצים ללכת פה לתכונות בצד ימין ואנחנו רוצים להגיד
לאקס קוד שלא תייצר לנו שום קוד וואטסווייבר אז אני אומר פה manual/none ואנחנו נעשה שלוש חלקים לסרטון הזה בעצם ואנחנו נראה את כל השלוש אפשרויות של מה זה קלאס דפינישן ומה זה מניואל אז ככה אתם תבינו את זה יותר מאוחר בהמשך.
כרגע אני אומר ל-Xcode אל תייצרי בשבילי בבקשה קלאס של פרסון, כי אנחנו רוצים יותר לראות איך Core Data בנויה מאחורי הקלעים, בהמשך אנחנו גם נייצר קלאס של פרסון.
טוב, עכשיו אמרתי לכם ש-Core Data לא רק נותנת לנו את ה-XData מודל, אלא Core Data משתמשת ב-AppDelegate, אז זה זמן טוב לדבר על AppDelegate.
ה-AppDelegate הוא בעצם אובייקט שהוא משותף לכל האפליקציה שלנו. יש לנו אובייקטים לכל מסך, נכון? קונטרולרים שמייצגים את המסך אבל בנוסף לכך יש לנו את האפ דליגייט שהוא בעצם אובייקט שנותן לנו מידע על האפליקציה ועל זמן החיים של האפליקציה.
למשל ברגע שהאפליקציה מסיימת את הריצה שלה היא מסיימת לעלות ברגע שהאפליקציה נטענה אז יש לנו את המתודה הזאת באפ דליגייט שנקראת האפליקציה סיימה להיטען. אוקיי כאן אם אני אכתוב כאן קוד זה קוד שרץ ברגע שהאפליקציה נטענת.
בוא נרשום לעצמנו הערה code that runs when the app starts. אוקיי נכבד לדעת עכשיו באותו אופן אז יש לנו עוד מתודות של Lifecycle של האפליקציה למשל האפליקציה יכולה לפתוח דרך אגב סצנות כי אפליקציה יכולה להיות מוצגת כמה פעמים באותו טלפון ואנחנו לא מאפשרים את זה אז מבחינתנו זה קצת פחות רלוונטי אבל רק שתדעו שיש אפשרות ב-iOS להציג את אותה אפליקציה שלוש אינסטנסים של אותה אפליקציה
כלומר להציג את אותה אפליקציה כמה פעמים כשהיא פתוחה נגיד את אני יכול לפתוח אותו לא ממש ב-iOS אלא בטאבלטים ולפתוח לידו עוד פעם את הדפדפן במקביל, אוקיי? כאילו לפתוח עוד חלון שהוא יהיה הדפדפן ליד, ועל כך מדבר המושג של הסצנות.
עכשיו, אנחנו בדרך כלל עובדים עם סצנה אחת, אז קצת פחות רלוונטי הדיון. טוב, אז רגע בוא נחזור למה שאנחנו רוצים להגיד. ה-AppDelegate מייצג בעצם איזשהו אובייקט שהוא משותף לכל האפליקציה ואפשר להשתמש בו כאובייקט משותף לאפליקציה.
איזושהי פונקציה נקרא לה PeopleDemo או PersonDemo ואני טוען שאפשר להגיע למתודה הזאת מכל ViewController. We can, נגיד, invoke this method from everywhere in our app.
אוקיי, אני יכול להפעיל את המתודה הזאת מכל מקום באפליקציה, זה מה שאני מנסה להגיד לכם, שזה נחמד וזאת הסיבה בעצם שCoreData משתמשת באבדל הגייט בשביל מקום טוב לשים בו את הדאטאבייס שלכם.
אז בואו נגיד שאיך שהאפליקציה נטענה אנחנו נפעיל את הפונקציה שכתבנו עכשיו peopleDemo ואתם יודעים מה בואו נעשה פה פרינט שנדע שהאפליקציה שלנו התחילה app started ונריץ את זה מה שאמרתי עכשיו לגבי app delegate תמיד היה נכון לגבי כל דבר ב-iOS אלא שעד עכשיו לא ממש הזדקקנו ל-app delegate אז לא ראינו אותו אבל עכשיו אנחנו רוצים להסתכל עליו
אז אתם יכולים לראות שברגע שהאפליקציה נטענה ועלתה על המכשיר מה שנקרא אז אני מקבל פה את ההודעה "האפליקציה התחילה". למה? כי זה מה שכתבתי בפונקציה.
אז ברגע שהאפליקציה מסיימת לרוץ, אנחנו יכולים להפעיל איזשהו קוד שהאפליקציה התחילה, ולא משנה איזה view controller נכנס ראשון או שני או שלישי, יש לנו את האובייקט של האפליקציה עצמו.
יפה. עכשיו, מה נוסף פה על ידי core data? כי הקובץ הזה היה כל הזמן. אם תפתחו פרויקט קודם שלכם, אתם תראו שהיה לכם tab delegate והיה את הפונקציה did finish launching with options למה אמרתי ש-Xcode משתמשת ב-abdelegate?
בואו נראה איפה אז כאן למטה יש לנו מרק של core data stack היתרון של המרק הזה זה שברגע שאתם כותבים הערה כזאת עם מרק נקודתיים זה שיש לכם פה בקובץ למעלה אפשרות לנווט ולראות את המרקים שלכם אז כאן כתוב ui session lifecycle וכאן כתוב core data stack שזה בדיוק ההערה הזו אבל אני יכול לנווט להערות שלי.
אז הם הוסיפו לנו מרק של core data stack, בעצם כאן מה שהקוד הזה עושה, הוא טוען את הקובץ אקסידאט מודל, שקוראים לו core data demo, זה השם של הקובץ, הוא פשוט טוען את הקובץ ובודק אם יש שגיאות אז הוא מקריס את האפליקציה, אם אין שגיאות אז הוא טוען את הקונטיינר, ועל הקונטיינר הזה למעשה נמצא הקונטקסט.