PracticU

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

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › חיבור למסד נתונים SQLite - חלק 4
מילון מושגים:
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
SQLite - מסד נתונים יחסי קל משקל ששמור בקובץ בודד, נפוץ ביישומים מקומיים ובאפליקציות מובייל.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.

חיבור למסד נתונים SQLite - חלק 4
אחרי שהמסד נוצר, השלב הבא הוא להוסיף מוצר לטבלה, ולקבל בחזרה את ה-id שהמסד נתן לו. השיעור בונה את הפונקציה addProduct ומחבר אותה לאפליקציה.
השלבים העיקריים
1. בניית השאילתה: insert into products (name, price) values (...). לא מציינים id, כי הוא autoincrement והמסד יוצר אותו.
2. שתי דרכים לשלב ערכים: שרשור מחרוזות (ערכי טקסט עטופים בגרש) או String.format. השנייה פשוטה יותר, עם placeholders: %s למחרוזת, %f למספר עשרוני ו-%d למספר שלם.
3. הרצה: getWritableDatabase() מחזיר את אובייקט המסד, ואז execSQL עם השאילתה. (יש גם getReadableDatabase לקריאה בלבד.)
4. קבלת ה-id: מריצים rawQuery עם select last_insert_rowid(), הפונקציה שמחזירה את המספר האוטומטי האחרון שהמסד יצר. מעבירים null לארגומנטים שלא בשימוש.
5. Cursor: התוצאה היא Cursor, אובייקט שמצביע על טבלה שהוחזרה מהמסד. הוא מצביע בכל רגע על שורה אחת, ובהתחלה על שורה וירטואלית לפני הראשונה. לכן קוראים ל-moveToNext() כדי להגיע לשורה הראשונה, ואז getInt(0) לעמודה הראשונה והיחידה. את התוצאה מציבים ב-product.setId(...).
6. סגירה: סוגרים את ה-Cursor ואת החיבור (close), כי חיבור למסד צורך משאבים.
7. חיבור ל-MainActivity: ב-onActivityResult, אחרי שמתקבל מוצר חדש (רק name ו-price), קוראים ל-database.addProduct(product) ואז מוסיפים אותו לרשימה המקומית. כיוון ש-Product הוא reference type, ה-id החדש מתעדכן גם באובייקט שברשימה.
8. ניקוי Product: המחולל הסטטי של ה-id מוסר, כי המסד אחראי על ה-id. נשאר בנאי שמקבל רק name ו-price וקורא לבנאי המלא.
בדיקה
הוספת green apple ו-round peach הציגה id 1 ו-id 2 ב-Toast שנוסף לבדיקה בלבד.
כעת אפשר להוסיף רשומה למסד ולקבל את המספור האוטומטי שלה בחזרה.
השיעור הבא בקורס: חיבור למסד נתונים SQLite - חלק 5

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

  1. 00:00

    פונקציה להוספת מוצר

  2. 00:43

    שאילתת INSERT INTO עם שרשור

  3. 02:48

    בניית השאילתה עם String.format

  4. 03:52

    getWritableDatabase והרצת execSQL

  5. 05:29

    קבלת ה-ID שהמסד יצר

  6. 06:41

    last_insert_rowid עם rawQuery

  7. 07:43

    מהו אובייקט Cursor

  8. 09:01

    הזזת הקורסור לשורה הראשונה

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

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

  1. 00:01

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

  2. 00:26

    אז אנחנו קודם כל צריכים לבנות שאילתת sql. השאילתה שלנו צריכה לשלב את הערכים מהפרודקט שהתקבל לפונקציה עם הטקסט של שאילתת ה-SQL. אז אנחנו כמובן יכולים לעשות את זה בעזרת שרשורים, ואנחנו יכולים לעשות את זה בעזרת string.format.

  3. 00:48

    בואו נעשה את זה בשתי הדרכים ונראה ש-string.format זה הרבה הרבה יותר פשוט. אז קודם כל, מהי השאילתה להוספה של פריט חדש?

  4. 01:00

    השאילתה היא insert into שם הטבלה, כי יכול להיות לנו הרבה טבלאות, products, לתוך name ו-price, שימו לב שאני לא אומר שאני רוצה להכניס מידע לתוך ID, מפני שאין לי את ה-ID והדאטאבסט צריך לייצר לי כי הוא auto increment.

  5. 01:22

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

  6. 01:44

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

  7. 02:17

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

  8. 02:45

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

  9. 03:16

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

  10. 03:47

    זה יהיה get name ומיד אחר כך get price והנה יש לנו עכשיו את אותה השאילתה של מקודם אבל קצת יותר קל לבנות אותה.

  11. 04:00

    אחרי שיש לנו את שאילתת ה-SQL, מה שאנחנו רוצים לעשות זה להגיע לרכיב SQLite דאטאבייס, כמו שהיה לנו מקודם SQLite דאטאבייס DB, תחת אותיות קטנות.

  12. 04:16

    מקודם אנחנו קיבלנו את האובייקט הזה לפונקציית onCreate ולפונקציית onUpgrade, ויכלנו להשתמש איתו בשביל לייצר שאילתא. בגלל שאנחנו בונים פונקציה משלנו, אין לנו את האובייקט הזה, אז אנחנו בונים פה משתנה ובאים ל-sqlight open helper וקוראים לפונקציה get writable database.

  13. 04:45

    יש לנו get writable database או get readable database, אם אנחנו רוצים לכתוב או לקרוא. אז אנחנו רוצים את get writable database כי אנחנו רוצים לכתוב לתוך ה-database ואנחנו רוצים לגשת ולקרוא לפונקציה execsql ולתת לה את שאילתת הsql שבנינו.

  14. 05:07

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

  15. 05:26

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

  16. 05:45

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

  17. 06:02

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

  18. 06:23

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

  19. 06:36

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

  20. 06:55

    והשאילתה שאנחנו רוצים זה raw query כי אנחנו מתעסקים פה בשאילתת sql טהורה שנקראת סלקט ומה אנחנו רוצים לבחור? אנחנו רוצים לבחור פקודה שנקראת last underline insert underline row id. זאת פונקציה למעשה שקיימת בתוך sqlite דאטאבייס ושמחזירה לנו את המספר האוטומטי האחרון שהדאטאבייס יצר לנו.

  21. 07:31

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

  22. 07:49

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

  23. 08:08

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

  24. 08:26

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

  25. 08:48

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

  26. 09:09

    אבל הקורסור תמיד בהתחלה מצביע על שורה וירטואלית שנמצאת לפני השורה הראשונה. לכן הפעולה הראשונה שאנחנו צריכים לעשות עם הקורסור זה לזרוק אותו move next שורה אחת קדימה וזה יהיה go to the first line בגלל שבהתחלה בהתחלה איך שהבאנו את הקורסור הוא עדיין לא מצביע על השורה הראשונה אלא על

  27. 09:39

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

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

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

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

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

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

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

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