
_id: ה-CursorAdapter דורש שעמודת ה-ID תיקרא _id. לכן עוברים על מחלקת מסד הנתונים ומחליפים כל שימוש ב-ID, כולל יצירת הטבלה. שמות שאר העמודות חופשיים.item_products), את הקורסור, מערך from עם שמות העמודות (_id, name, price), מערך to עם הרכיבים החזותיים לפי אותו סדר, ודגלים בערך 0. כך נחסכים ניפוח ה-layout, איתור הרכיבים והכנסת הערכים, ואפשר למחוק את getView ואת ה-LayoutInflater.getProductsCursor, שמחזירה rawQuery של select * from products. ב-MainActivity מוחקים את כל השימושים ברשימה.getOneProduct שמקבלת ID, קוראת ממסד הנתונים את השם והמחיר ומחזירה אובייקט מוצר. עכשיו הפונקציות update ו-delete מקבלות ID ולא מיקום ברשימה.swapCursor עם קורסור חדש, וקריאות notifyDataSetChanged מוסרות כי הן לא עובדות כאן. את מספר המוצרים מקבלים מ-getCount של האדפטר.bindView שנדרסת באדפטר. את ה-ID לוקחים מה-TextView של ה-ID ומשתמשים בו במקום המיקום.getProductName שמביאה רק שם, ו-deleteProduct שמקבלת רק ID במקום מוצר שלם.הטקסט המלא של הדקות הראשונות בהרצאה «חיבור למסד נתונים SQLite - חלק 9» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטונים הקודמים עבדנו עם דאטאבייס ושמרנו לתוכו את כל המידע שהיוזר הזין לתוכנית. בנוסף היה לנו אריי ליסט שהיינו צריכים בכדי להציג את המידע על ידי האדפטר. מה שאנחנו הולכים לראות בסרטון הזה זה איך אנחנו יכולים לעבוד עם אדפטר ללא שום אריי ליסט למה לפעמים זה יהיה טוב לנו כי אז אנחנו לא נצטרך לטפל בשני מקורות מידע בתוכנית
גם בדאטאבייס וגם באריי ליסט אנחנו יכולים לעבוד רק עם הדאטאבייס כדי שהמידע כמובן יישמר בו כאשר סוגרים את האפליקציה ואנחנו יכולים לטעון אותו כאשר האפליקציה נטענת שוב אבל אנחנו לא נצטרך עוד הרייליסט לנהל תוך כדי הריצה של התוכנית ואז רק בכדי שנוכל להציג אותו באדפטר.
איך עושים את זה? על ידי משהו שנקרא קורסור אדפטר. קורסור אדפטר זה אדפטר שמציג מידע מקורסור וקורסור הרי ראינו זה מידע שמגיע ישירות מהדאטאבייס אז בואו נעשה את זה בדיוק על התוכנה שעבדנו איתה ושהצלחנו דרכה לשמור את המידע על הדאטאבייס.
הדבר הראשון שאנחנו צריכים להבין זה שהקורסור אדפטר הולך להציג את המידע ישירות מהדאטאבייס על ידי קורסור אבל קורסור אדפטר רוצה שה-id שלנו לא ייקרא id אלא ייקרא underlineid ואיזשהו דבר שהקורסור אדפטר מבקש או דורש.
לכן אנחנו צריכים עכשיו לגשת למחלקת דאטאבייס שבנינו ובכל מקום שהשתמשנו עם id פשוט לשנות אותו ל-underlineid. אז בואו נראה איפה עשינו את זה, קודם כל ביצירה של הטבלה כמובן, בואו נתחיל לחפש כאן כל מקום שהשתמשנו עם ID מבחינת הדאטאבייס, כאן אני לא רואה שיש לנו, הנה כאן יש לנו ID,
נעביר אותו ל-underline ID, גם כאן יש לנו underline ID, ונראה לי שאלו כל השינויים. Good. אז קודם כל מה שעשינו זה הלכנו עם הקביעה של הקורסור אדפטר ה-id צריך להיות underline-id שאר שמות העמודות אנחנו יכולים להחליט איזה שמות שאנחנו
רוצים. הדבר הבא שאנחנו צריכים לעשות זה לא לרשת מ-ArrayAdapter אלא לרשת מ-CursorAdapter או מאחת המחלקות שיורשות את CursorAdapter.
קיימת מחלקה שיחסית פשוט לעבוד איתה והיא נקראת SimpleCursorAdapter. הדבר הבא שאנחנו רוצים לעשות זה לעדכן את הקוד בתוך הפרודקטס אדפטר שאנחנו בונים שכבר לא יורש מהרי אדפטר אלא מסימפל קורסור אדפטר.
הקונסטרקטור שלנו מקבל את הקונטקסט במקום לקבל הרייליסט של מוצרים הוא מקבל קורסור להצגה. בואו נקרא לו פרודקטס קורסור. עכשיו איך הקורסור אדפטר עובד?
אם אנחנו בנינו את הפרודקט אדפטר על ידי הורשה של הרה אדפטר, אנחנו אחר כך דרסנו את הפונקציה get view שהתבצעה עבור כל אחד מהפריטים שמוצגים, ומה שעשינו בפונקציה הזאת זה א' ניפחנו את הלייאוט הדרוש, אנחנו רואים שהלייאוט הזה, הלייאוט שבנינו כאן, אייטם product, הנה הוא נמצא פה,
בלייאוט הזה היה לנו את הרכיבים הדרושים להצגה, שזה היה טקסט-ויו עבור ID, טקסט-ויו עבור Name, טקסט-ויו עבור Price ושני לחצנים.
ומה שעשינו זה פשוט, אחרי שניפחנו את הלאוט, איתרנו את הרכיבים הוויזואליים ואז שמנו בהם את המידע. ככה בעצם ה-ray-adapter שאנחנו בונים יודע איך להציג את האינפורמציה.
שימו לב ששלושת השורות האלה שאני מסמן כרגע זה ההצגה של המידע ולאחר מכן יש הוראה ללחצנים מה לעשות שלוחצים עליהם.
הקורסור אדפטר שאנחנו רוצים לבנות הולך לעשות את זה בעצמו, כלומר את ההצגה של המידע אנחנו רק מביאים לו קורסור של מוצרים ואז מה שהוא עושה הוא פשוט צריך לשלוף את המידע הזה מהקורסור ולהציג אותו ברכיבים הוויזואליים.
אז בעצם המחלקה שאנחנו בונים הולכת לנפח בעצמה את ה-Layout והולכת בעצמה לשים בתוך ה-Layout את הדאטה מהCursor לרכיבים הוויזואליים.
איך היא הולכת לעשות את זה? כי אנחנו הולכים להגיד לה ב-Constructor ב-Super בדיוק איך לבצע את זה. בואו נמחק את שני אלה ונראה שהפריט הבא שאנחנו צריכים לתת זה איזה layout אנחנו רוצים שהיא תנפח לבד.
זה יהיה r.layout.item.product. הדבר הבא זה מהו הקורסור, product.corsor והדבר הבא זה from, זה בעצם השמות של העמודות שאנחנו רוצים לקחת מהקורסור והמערך הבא זה 2, אילו רכיבים ויזואליים אנחנו רוצים לשים אותם בהתאמה.
כלומר, איזה שם של עמודה לקחת מהקורסור, ולאיזה רכיב ויזואלי לשים את הערך שלו והכל בהתאמה. אז אלו שני מערכים בעצם שאנחנו צריכים לספק. אז בואו נספק כאן New String בצורה כזאת ו-New Int בצורה כזאת.
הפריט האחרון שאנחנו צריכים לתת זה דגלים. אין לנו כרגע שימוש בזה, אז אנחנו נעביר 0. מה אנחנו רוצים לתת במערך מחרוזות הראשון שאחראי על שמות העמודות? כמובן, מהם השמות של העמודות שאנחנו רוצים לקחת מהם את המידע?
זה יהיה underline ID, לאחר מכן המחרוזת name, לאחר מכן המחרוזת price, ולאלו רכיבים ויזואליים אנחנו רוצים לשים אותם.
הנה הרכיב הראשון, ומה שהולך להיכנס לתוכו זה ה-underline ID, מפני שהבריטים נכנסים בהתאמה. הנה הרכיב השני, בואו נעשה פה פסיק, והנה הרכיב השלישי, זה פשוט ה-ID שלהם, ואז הקורסור אדפטר יבצע ריצה על הקורסור, שליפת המידע, ניפוח ה-layout הזה והכנסת המידע מפה לפה וכולי
בהתאמה וזה חוסך לנו גם את הניפוח, גם את מציאת הערכים, הרכיבים הוויזואליים וגם את הכנסת המידע אליהם ובגדול את כל הצורך ב-array list.
ולא שאנחנו לא נצטרך לטפל בלחצנים ואנחנו לא צריכים לטפל בהכנסת המידע עצמו ואנחנו גם לא צריכים שיהיה לנו arraylist בנוסף לדאטאבייס. אוקיי אז דבר ראשון מה שנעשה זה נשים את כל הפונקציה get view הזאת בהערה כי יש בה כל מיני שגיאות קומפילציה ואנחנו לא בדיוק צריכים אותה כמו שהיא כרגע ואנחנו גם לא צריכים את ה-layout inflator הזה אפשר להיפטר ממנו
ואנחנו לא צריכים גם את הלייאוט אינפלייטר הזה, למעשה בואו נמחק אותם כליל. גם את זה וגם את זה, ביי ביי, אין לנו אותם. מה עוד אנחנו לא צריכים? אנחנו לא צריכים לנפח את הלייאוט, ואנחנו לא צריכים לאתר את הרכיבים הוויזואליים האלה, ואנחנו לא צריכים לאתר את המוצר, ולשים בתוכו את הערכים,
אלה גם כן ניפטר מהם. לשים בתוכם את הערכים ממנו, ועדיין לא טיפלנו בלחצנים, ולכן את זה נשאיר, אוקיי? אז יש לנו פה כרגע את ה-Products Adapter שאומר תביאו לי קורסור במקום הרייליסט.
אנחנו רוצים עכשיו להביא לו קורסור במקום הרייליסט של כל המוצרים. אז אנחנו צריכים לחזור למחלקת ה-Database שלנו, ובמקום כל הסיפור הזה שמביא הרייליסט, אנחנו רוצים לשנות כך שהוא יוחזר קורסור במקום הרייליסט.
אוקיי, בואו נמחק את כל השורה הזאת. כל הפונקציה הזאת ופשוט נבנה פונקציה שמחזירה לנו קורסור והיא נקראת get products cursor מה שהפונקציה הזאת צריכה לעשות זה sqlite database db get readable database return db.raw query ראינו שהיא כבר מחזירה לנו אובייקט קורסור ופשוט נעשה Select All From Products וזה כל מה
שאנחנו צריכים בשביל להביא קורסור שמצביע על טבלת המוצרים. עכשיו יש לנו את הפונקציה Get Products Coursor, אנחנו רוצים לגשת ל-Main Activity וכאן ב-Main Activity במקום לתת את ה-ArrayList שאין לנו דרך אגב יותר את הקטע קוד הזה, אנחנו רוצים לגשת לדייטאבייס ולהביא את כל המוצרים על ידי קורסור ולמעשה אנחנו רוצים
גם להיפטר מכל מקום שבו יש את הרייליסט של המוצרים. אז בואו נסמן אותו פה למעלה ונמחק אותו ואז ניגש ונראה כל מקום שיש שימוש ברייליסט הזה אנחנו מוחקים אותו.
אז הנה יש לנו את זה והנה בעדכון מוצר אין לנו את ה-ArrayList הזה, זה אנחנו צריכים להיפטר ממנו. כאן אנחנו רואים שיש לנו פה איזושהי בעיה ב-Get Message, אין לנו את ה-ArrayList, את זה אנחנו צריכים לטפל.
Delete, אנחנו רוצים לשלוח את המוצר למחיקה, את זה אנחנו צריכים לטפל. אין לנו את ה-ArrayList, נוריד אותו.
לאחר מכן אנחנו רואים פה שאנחנו מוסיפים את ה-ArrayList, מוסיפים ל-ArrayList, זה נמחק. אין לנו צורך לעדכן פה ב-Update, את כל העלולה הזאת אנחנו יכולים למחוק ואת כל תוכן הפונקציה הזאת אנחנו מוחקים ואנחנו יכולים כבר בשלב הזה לראות האם הכנסת המידע לדאטאבייס עובדת כמו שצריך והצגת המידע מהדאטאבייס עובדת כמו שצריך.
רק שני האלמנטים האלה. אוקיי, אז בואו נריץ, בואו ניגש ונוסיף מוצר חדש, והנה אפל, שלוש וחצי. נבצע הוספה, נוסיף עוד מוצר, פיצ' ארבע שבע, נצא מהתוכנית וניכנס אליה שוב.
והנה אנחנו רואים שהמידע נשמר בדאטאבייס ונטען, וכמובן שאנחנו צריכים לגשת ולטפל בכל המחיקות האלה שעשינו של ה-ArrayList.
טוב, אז בואו ניגש מלמעלה למטה ונראה מה הם היו השינויים האלה. אז דבר אחד שאנחנו עשינו כאן ושברגע שהיוזר רוצה לבצע אפדייט הוא צריך לקבל את המידע של אותו פריט שאנחנו רוצים לעדכן.
בגלל שהיה לנו array list אז פשוט פנינו ל-array list ושלחנו את המידע אליו ואנחנו רואים שזה