PracticU

חיבור למסד נתונים SQLite - חלק 9

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › חיבור למסד נתונים SQLite - חלק 9
מילון מושגים:
SQLite - מסד נתונים יחסי קל משקל ששמור בקובץ בודד, נפוץ ביישומים מקומיים ובאפליקציות מובייל.
ArrayList - מבנה נתונים של רשימה דינמית שגודלה משתנה, הנפוץ בשפות כמו Java ו-C#.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
ירושה - מנגנון בתכנות מונחה עצמים שבו מחלקה יורשת תכונות ופעולות ממחלקת אב, ויכולה להרחיב אותן.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
DELETE - פקודת SQL למחיקת שורות מטבלה. גם שיטת HTTP לבקשת מחיקה של משאב בשרת.

חיבור למסד נתונים SQLite - חלק 9
בדוגמה הזאת מוותרים על ה-ArrayList שהחזיק עותק של המוצרים לצד מסד הנתונים, ומציגים את הנתונים ישירות מ-Cursor באמצעות CursorAdapter. כך יש בתוכנית מקור מידע אחד בלבד.
השלבים העיקריים
1. עמודת המפתח נקראת _id: ה-CursorAdapter דורש שעמודת ה-ID תיקרא _id. לכן עוברים על מחלקת מסד הנתונים ומחליפים כל שימוש ב-ID, כולל יצירת הטבלה. שמות שאר העמודות חופשיים.
2. ירושה מ-SimpleCursorAdapter: ה-ProductsAdapter כבר לא יורש מ-ArrayAdapter אלא מ-SimpleCursorAdapter. הקונסטרקטור מקבל Context וקורסור של מוצרים במקום רשימה.
3. הפרמטרים של super: מעבירים את ה-layout שהאדפטר מנפח בעצמו (item_products), את הקורסור, מערך from עם שמות העמודות (_id, name, price), מערך to עם הרכיבים החזותיים לפי אותו סדר, ודגלים בערך 0. כך נחסכים ניפוח ה-layout, איתור הרכיבים והכנסת הערכים, ואפשר למחוק את getView ואת ה-LayoutInflater.
4. פונקציה שמחזירה קורסור: במחלקת מסד הנתונים מוחקים את הפונקציה שהחזירה רשימה ובונים getProductsCursor, שמחזירה rawQuery של select * from products. ב-MainActivity מוחקים את כל השימושים ברשימה.
5. מוצר בודד לפי ID: בנוי getOneProduct שמקבלת ID, קוראת ממסד הנתונים את השם והמחיר ומחזירה אובייקט מוצר. עכשיו הפונקציות update ו-delete מקבלות ID ולא מיקום ברשימה.
6. רענון עם swapCursor: אחרי הוספה, עדכון ומחיקה קוראים ל-swapCursor עם קורסור חדש, וקריאות notifyDataSetChanged מוסרות כי הן לא עובדות כאן. את מספר המוצרים מקבלים מ-getCount של האדפטר.
7. כפתורים ב-bindView: את הרישום לאירועי הלחצנים (עדכון ומחיקה) מעבירים לפונקציה bindView שנדרסת באדפטר. את ה-ID לוקחים מה-TextView של ה-ID ומשתמשים בו במקום המיקום.
פשרות ושיפורים
הרשימה בזיכרון מהירה יותר מגישה לדיסק, והיתרון של CursorAdapter הוא ניהול מקור מידע אחד. אם מסד הנתונים קטן ואין בעיית מהירות, הוא מתאים. אם יש בעיות ביצועים, כדאי לחזור להחזיק את הנתונים גם ברשימה.
המרצה הציע גם לצמצם פניות למסד הנתונים: פונקציה getProductName שמביאה רק שם, ו-deleteProduct שמקבלת רק ID במקום מוצר שלם.
כעת אפשר להציג נתונים מטבלה ב-ListView ישירות מקורסור, ולהוסיף, לעדכן ולמחוק בלי רשימה מקבילה.
השיעור הבא בקורס: חיבור למסד נתונים SQLite - חלק 10

פרקי ההרצאה: חיבור למסד נתונים SQLite - חלק 9

  1. 00:00

    עבודה עם Adapter בלי ArrayList

  2. 00:56

    מהו CursorAdapter

  3. 01:38

    שינוי העמודה ID ל-_id

  4. 02:34

    ירושה מ-SimpleCursorAdapter

  5. 05:13

    הגדרת Layout ומערכי from ו-to

  6. 08:23

    הסרת הקוד המיותר מה-Adapter

  7. 09:36

    הפונקציה getProductsCursor

  8. 12:21

    בדיקת שמירה וטעינה מהמסד

תמלול ההרצאה: חיבור למסד נתונים SQLite - חלק 9

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

  1. 00:01

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

  2. 00:29

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

  3. 00:55

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

  4. 01:17

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

  5. 01:44

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

  6. 02:12

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

  7. 02:42

    רוצים. הדבר הבא שאנחנו צריכים לעשות זה לא לרשת מ-ArrayAdapter אלא לרשת מ-CursorAdapter או מאחת המחלקות שיורשות את CursorAdapter.

  8. 02:55

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

  9. 03:14

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

  10. 03:34

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

  11. 04:01

    בלייאוט הזה היה לנו את הרכיבים הדרושים להצגה, שזה היה טקסט-ויו עבור ID, טקסט-ויו עבור Name, טקסט-ויו עבור Price ושני לחצנים.

  12. 04:16

    ומה שעשינו זה פשוט, אחרי שניפחנו את הלאוט, איתרנו את הרכיבים הוויזואליים ואז שמנו בהם את המידע. ככה בעצם ה-ray-adapter שאנחנו בונים יודע איך להציג את האינפורמציה.

  13. 04:34

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

  14. 04:46

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

  15. 05:07

    אז בעצם המחלקה שאנחנו בונים הולכת לנפח בעצמה את ה-Layout והולכת בעצמה לשים בתוך ה-Layout את הדאטה מהCursor לרכיבים הוויזואליים.

  16. 05:22

    איך היא הולכת לעשות את זה? כי אנחנו הולכים להגיד לה ב-Constructor ב-Super בדיוק איך לבצע את זה. בואו נמחק את שני אלה ונראה שהפריט הבא שאנחנו צריכים לתת זה איזה layout אנחנו רוצים שהיא תנפח לבד.

  17. 05:44

    זה יהיה r.layout.item.product. הדבר הבא זה מהו הקורסור, product.corsor והדבר הבא זה from, זה בעצם השמות של העמודות שאנחנו רוצים לקחת מהקורסור והמערך הבא זה 2, אילו רכיבים ויזואליים אנחנו רוצים לשים אותם בהתאמה.

  18. 06:15

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

  19. 06:42

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

  20. 07:02

    זה יהיה underline ID, לאחר מכן המחרוזת name, לאחר מכן המחרוזת price, ולאלו רכיבים ויזואליים אנחנו רוצים לשים אותם.

  21. 07:17

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

  22. 07:50

    בהתאמה וזה חוסך לנו גם את הניפוח, גם את מציאת הערכים, הרכיבים הוויזואליים וגם את הכנסת המידע אליהם ובגדול את כל הצורך ב-array list.

  23. 08:10

    ולא שאנחנו לא נצטרך לטפל בלחצנים ואנחנו לא צריכים לטפל בהכנסת המידע עצמו ואנחנו גם לא צריכים שיהיה לנו arraylist בנוסף לדאטאבייס. אוקיי אז דבר ראשון מה שנעשה זה נשים את כל הפונקציה get view הזאת בהערה כי יש בה כל מיני שגיאות קומפילציה ואנחנו לא בדיוק צריכים אותה כמו שהיא כרגע ואנחנו גם לא צריכים את ה-layout inflator הזה אפשר להיפטר ממנו

  24. 08:48

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

  25. 09:13

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

  26. 09:35

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

  27. 09:56

    אוקיי, בואו נמחק את כל השורה הזאת. כל הפונקציה הזאת ופשוט נבנה פונקציה שמחזירה לנו קורסור והיא נקראת get products cursor מה שהפונקציה הזאת צריכה לעשות זה sqlite database db get readable database return db.raw query ראינו שהיא כבר מחזירה לנו אובייקט קורסור ופשוט נעשה Select All From Products וזה כל מה

  28. 10:37

    שאנחנו צריכים בשביל להביא קורסור שמצביע על טבלת המוצרים. עכשיו יש לנו את הפונקציה Get Products Coursor, אנחנו רוצים לגשת ל-Main Activity וכאן ב-Main Activity במקום לתת את ה-ArrayList שאין לנו דרך אגב יותר את הקטע קוד הזה, אנחנו רוצים לגשת לדייטאבייס ולהביא את כל המוצרים על ידי קורסור ולמעשה אנחנו רוצים

  29. 11:10

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

  30. 11:27

    אז הנה יש לנו את זה והנה בעדכון מוצר אין לנו את ה-ArrayList הזה, זה אנחנו צריכים להיפטר ממנו. כאן אנחנו רואים שיש לנו פה איזושהי בעיה ב-Get Message, אין לנו את ה-ArrayList, את זה אנחנו צריכים לטפל.

  31. 11:45

    Delete, אנחנו רוצים לשלוח את המוצר למחיקה, את זה אנחנו צריכים לטפל. אין לנו את ה-ArrayList, נוריד אותו.

  32. 11:56

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

  33. 12:31

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

  34. 13:01

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

  35. 13:15

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

  36. 13:35

    בגלל שהיה לנו array list אז פשוט פנינו ל-array list ושלחנו את המידע אליו ואנחנו רואים שזה

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

ההרצאה הקודמת: חיבור למסד נתונים SQLite - חלק 8

ההרצאה הבאה: חיבור למסד נתונים SQLite - חלק 10

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

  • חיבור אפליקציה למסד נתונים
  • קורס PHP - הרצאה 10 - חיבור למסד נתונים
  • חיבור למסד נתונים - Connection String
  • יצירת אפליקציה עם חיבור למסד נתונים

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

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