
getSharedPreferences שייכת ל-Context. במחלקה שאינה Activity משתמשים במחלקה MyApp שיורשת מ-Application, שומרת Context סטטי ב-onCreate ומחזירה אותו בפונקציה סטטית. מגדירים אותה במאניפסט כמחלקת האפליקציה.SharedPreferencesHelper: מכילה פונקציות סטטיות. הפונקציה save מקבלת מפתח וערך, משיגה Context מ-MyApp.getContext(), מקבלת את האובייקט עם MODE_PRIVATE, פותחת Editor, קוראת ל-putString ול-commit.save עבור int עם putInt. אפשר להשתמש באותו שם כי הפרמטרים שונים.SharedPreferencesHelper.save.loadString ו-loadInt. כל אחת קיימת בשתי גרסאות: עם ערך ברירת מחדל, וגרסה שמעבירה null (למחרוזת) או 0 (ל-int) ומשתמשת בגרסה הראשונה.loadString("username"), ול-loadInt בלי להעביר 0.save מבצע שוב השגת Context, אובייקט ו-Editor, וגם commit, שהוא כתיבה לדיסק. אם שומרים הרבה ערכים בבת אחת, עדיף Editor אחד, כמה put ו-commit אחד בסוף. אם המהירות לא חשובה, המחלקה מתאימה.הטקסט המלא של הדקות הראשונות בהרצאה «Shared Preferences Helper Class» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כששמרנו מידע על ה-Shared Preferences היינו צריכים לבנות אובייקט מסוג Shared Preferences לקבל אותו על ידי הפונקציה Get Shared Preferences עם איזושהי מכרוזת ספציפית עבור האפליקציה שלנו, לאחר מכן להביא אובייקט אדיטור ממנו, לבצע את השמירה ואז בסוף לבצע קומיט.
כאשר רצינו לטעון את הנתונים עשינו בדיוק את אותו הדבר על ידי יצירת האובייקט עם אותה המכרוזת, כאן לא היינו צריכים את האדיטור ומיד קראנו את הנתונים.
אז אין בעיה לבצע את הפעולות האלה בכל מקום באפליקציה שבה אנחנו רוצים לשמור שירט פרפרנסס ובכל מקום שבו אנחנו רוצים לטעון שירט פרפרנסס.
אבל לפעמים כדאי לבנות איזושהי מחלקה נפרדת שהיא תהיה מעין מחלקת עזר כזאת שתעשה עבורנו את השמירה ואת התאנה ואז הקוד עצמו יהיה הרבה יותר נקי והרבה פחות שורות קוד עבור טיפול ב-shared preferences אז בואו נעשה את זה לפני שנתחיל לבנות את המחלקה הזאת רק נראה שהפונקציה get shared preferences נמצאת ברמת הקונטקסט
אם אנחנו רוצים במחלקה אחרת שהיא לא activity והיא לא בעצמה קונטקסט להשיג את הקונטקסט אנחנו צריכים לבצע את הטריק ההוא שעשינו פעם שמאפשר להשיג את הקונטקסט מכל מקום אז בואו נעשה את זה בואו נבנה מחלקה נקרא לה my app נגדיר בתוכה private static context הנה יש לנו פה את המשתנה הקונטקסט המחלקה צריכה לרשת את אפליקיישן אנחנו צריכים לדרוס את onCreate
לקרוא ל-super onCreate ולקחת את הקונטקסט נבצע עוד פונקציה סטטית שמאפשרת להחזיר את הקונטקסט והנה סיימנו לבנות את המחלקה מיי-אפ אנחנו צריכים להגדיר שהמניפסט נבנה על ידי המחלקה הזאת, או שהאפליקציה ליתר דיוק נבנית על ידי המחלקה
הזאת, שהיא יורשת בתורה את אפליקיישן. ועכשיו יש לנו קונטקסט מכל מקום. אז אנחנו יכולים עכשיו לגשת ולהוסיף מחלקה חדשה. בואו נקרא לה Shared Preferences Helper.
המחלקה הזאת תכיל פונקציות סטטיות המאפשרות לכתוב מידע ל-Shared Preferences ולקרוא מה-Shared Preferences. בואו נתחיל עם כתיבה.
אז נבנה פה פונקציה סטטית, שנקראת פשוט save. הפונקציה מקבלת את המפתח, הפונקציה מקבלת את ה-value וכל מה שהיא עושה זה שומרת את המידע הזה ל-shared preferences.
בואו נשיג קונטקסט, my app get context ואז אנחנו יכולים לפנות ל-shared preferences דרך הקונטקסט, לתת לו את preferences context mode private, mode private זה קבוע ששייך לקונטקסט ועכשיו אנחנו אנחנו יכולים להשיג את האדיטור SharedPreferencesEditor נבנה אובייקט ממנו על ידי
SharedPreferences.Edit והנה יש לנו את האדיטור ואנחנו יכולים עכשיו לבצע את הכתיבה. אנחנו רוצים לכתוב רק דבר אחד Editor.PutString ואנחנו רוצים את ה-Key ואת ה-Value שקיבלנו.
לבסוף Editor.Commit ופה סיימנו את הפונקציה. הפונקציה שבנינו מטפלת אך ורק במחרוזת. אם אנחנו רוצים לטפל בעוד טיפוסים באפליקציה אנחנו צריכים לשכפל את הפונקציה הזאת ולגרום לה לטפל בטיפוסים נוספים.
לדוגמה int זה יהיה במקום putString putInt אז זה נכון שאנחנו כאילו משכפלים הרבה פונקציות אבל אנחנו עושים את זה פעם אחת כדי שמעכשיו אנחנו נוכל בקלות לשמור מידע ל-shared preferences פשוט על ידי הפונקציות הסטטיות שבנינו.
לא נצטרך יותר להתעסק עם המכרוזות האלה, עם המוד פרייבט, לקבל את ה-shared preferences מהמערכת וכולי. פשוט בכל פעם שאנחנו מבצעים שמירה לא יהיו לנו שלוש שורות, תהיה לנו שורה אחת.
אוקיי, אז יש לנו פה את ה-saving שכרגע רק בנינו פונקציות שמאפשרות לשמור מכרוזת ואינטג'ר. איך אנחנו משתמשים בסייבינג? בואו נחזור למיין אקטיביטי ובמקום כל הפקודות האלה פקודה ראשונה נעיף את כל זאת ואת הפקודה הזאת ואת ה-commit אין לנו צורך בהם כל מה שאנחנו
רוצים לעשות זה לפנות ל-shared preferences helper.save רק את המידע שלנו שכרגע זה סטרינג ואינטג'ר בואו נשכפל את זה גם לכאן והנה יש לנו הרבה פחות קוד שאנחנו יכולים בעזרתו לבצע את השמירה של מידע ל-shared preferences.
בואו ניפטר פה מכל מיני שורות בצורה כזאת. כעת אנחנו רוצים לבצע את אותו הדבר עבור התאנה לצורך כך אנחנו צריכים לבנות פונקציות שטוענות מידע אבל כאן כאן אנחנו לא נוכל כבר להשתמש במעין העמסה כזאת של טיפוסים שונים, מפני שהפונקציות צריכות להחזיר טיפוס שונה, ואנחנו לא יכולים לבצע העמסה של פונקציות,
כלומר מספר פונקציות עם אותו השם, כאשר מה שמבדיל בין אחת לשנייה זה רק הערך המוחזר או הטיפוס המוחזר. אז בואו נבנה פונקציה שמחזירה סטרינג והיא נקראת LoadString, היא תקבל רק את המפתח ותחזיר את הפריט.
עוד פעם אנחנו צריכים את ה-context, בואו ניקח אותו גם לפה. הדבר הבא שאנחנו צריכים זה את אותו Object Shared Preferences, ופשוט להחזיר Shared Preferences, נקודה Get String, הנה המפתח ואין לי פה איזשהו value של ערך ברירת מחדל.
אז מה שנעשה, נעשה כזה דבר. דבר ראשון, נשכפל את הפונקציה LoadString כך שהיא תחוויר גם ערך עם ברירת מחדל וגם ערך בלי ברירת מחדל.
אז יש לנו פה את ה-DefaultValue שניתן לה בצורה כזאת, והדבר הבא שנעשה, ונשכפל את הפונקציה הזאת לעוד אחת שתחזיר ערך עם ברירת מחדל נ"ל.
נחזיר את LoadString הקודמת שבנינו עם נ"ל. עכשיו בואו נסתכל לרגע על שתי הפונקציות האלה. הפונקציה הראשונה LoadString אומרת לנו תנו לי את המפתח של הפריט מהשארד פרפרנסס ואיזשהו ערך ברת מחדל של במידה והפריט לא נמצא אני אביא לכם את הערך ברת מחדל הזה.
ואז אנחנו משתמשים בערך ברת מחדל בשביל להביא את הפריט מהשארד פרפרנסס. הפריט כאמור הוא סטרינג ולכן LoadString מחזירה סטרינג.
אבל אנחנו יודעים שהרבה פעמים באפליקציה אנחנו מעוניינים פשוט להחזיר נ"ל בתור ערך ברת מחדל. נניח שזה המצב באפליקציה שלנו, אז אין שום בעיה, נבצע העמסה נוספת שמשתמשת בהעמסה הקודמת עם נ"ל.
אז בכל מקום באפליקציה שאנחנו רוצים שאיך הבחדל יהיה נ"ל, אנחנו לא צריכים להעביר