
id שהמסד נתן לו. השיעור בונה את הפונקציה addProduct ומחבר אותה לאפליקציה.insert into products (name, price) values (...). לא מציינים id, כי הוא autoincrement והמסד יוצר אותו.String.format. השנייה פשוטה יותר, עם placeholders: %s למחרוזת, %f למספר עשרוני ו-%d למספר שלם.getWritableDatabase() מחזיר את אובייקט המסד, ואז execSQL עם השאילתה. (יש גם getReadableDatabase לקריאה בלבד.)rawQuery עם select last_insert_rowid(), הפונקציה שמחזירה את המספר האוטומטי האחרון שהמסד יצר. מעבירים null לארגומנטים שלא בשימוש.Cursor, אובייקט שמצביע על טבלה שהוחזרה מהמסד. הוא מצביע בכל רגע על שורה אחת, ובהתחלה על שורה וירטואלית לפני הראשונה. לכן קוראים ל-moveToNext() כדי להגיע לשורה הראשונה, ואז getInt(0) לעמודה הראשונה והיחידה. את התוצאה מציבים ב-product.setId(...).Cursor ואת החיבור (close), כי חיבור למסד צורך משאבים.onActivityResult, אחרי שמתקבל מוצר חדש (רק name ו-price), קוראים ל-database.addProduct(product) ואז מוסיפים אותו לרשימה המקומית. כיוון ש-Product הוא reference type, ה-id החדש מתעדכן גם באובייקט שברשימה.id מוסר, כי המסד אחראי על ה-id. נשאר בנאי שמקבל רק name ו-price וקורא לבנאי המלא.id 1 ו-id 2 ב-Toast שנוסף לבדיקה בלבד.הטקסט המלא של הדקות הראשונות בהרצאה «חיבור למסד נתונים SQLite - חלק 4» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שיש לנו את הדאטאבייס והוא נוצר בהצלחה אנחנו יכולים לעבור ולבנות את הפונקציה להוספת מוצר אחד. אז בואו נבנה כאן public void add product פונקציה שפשוט מקבלת אובייקט product ומה שהיא עושה זה מוסיפה אותו לדאטאבייס לטבלת product כשורה חדשה.
אז אנחנו קודם כל צריכים לבנות שאילתת sql. השאילתה שלנו צריכה לשלב את הערכים מהפרודקט שהתקבל לפונקציה עם הטקסט של שאילתת ה-SQL. אז אנחנו כמובן יכולים לעשות את זה בעזרת שרשורים, ואנחנו יכולים לעשות את זה בעזרת string.format.
בואו נעשה את זה בשתי הדרכים ונראה ש-string.format זה הרבה הרבה יותר פשוט. אז קודם כל, מהי השאילתה להוספה של פריט חדש?
השאילתה היא insert into שם הטבלה, כי יכול להיות לנו הרבה טבלאות, products, לתוך name ו-price, שימו לב שאני לא אומר שאני רוצה להכניס מידע לתוך ID, מפני שאין לי את ה-ID והדאטאבסט צריך לייצר לי כי הוא auto increment.
לאחר מכן אנחנו רוצים להכניס את ה-values ואז אנחנו אנחנו רוצים עכשיו לשרשר את המידע מהפרודקטס עבור name ועבור price. בשפת sql אם המידע הוא מכרוזתי צריך לעטוף אותו בגרש גרש.
אם המידע הוא מספר אנחנו לא חייבים גרש גרש. אז זה אומר שאנחנו רוצים עכשיו להכניס בדיוק כאן את הערך של ה-name ובדיוק כאן את הערך של ה-price ואז לסגור את הסוגריים אבל מכאן אנחנו רוצים לסגור את המחרוזת ולפתוח אותה שוב כאשר באמצע אנחנו רוצים לשרשר את product.getName גם כאן
אנחנו רוצים לסגור את המחרוזת ולשרשר את product.getPrice והנה יש לנו עכשיו שאילתת sql שמכילה בתוכה את השם של המוצר ואת המחיר. עכשיו שימו לב שיש לנו פה שרשורים שיכולים טיפה לבלבל.
אז בואו נעשה את אותה פקודה בדיוק, נשכפל אותה, אבל עם string.format שזה קצת יותר נוח. מה שאנחנו עושים זה פשוט בונים את המחרוזת כמחרוזת אחת ויחידה בצורה כזאת ובאותו המקום שאנחנו רוצים לשתול ערך אנחנו מכניסים משהו שנקרא placeholder, שומר מקום.
אם הערך הוא מחרוז D זה יהיה אחוז S, אם הערך הוא מספר עשרוני זה יהיה אחוז F, אם הערך הוא מספר שלם זה יהיה אחוז D. החוקים. אז אחרי שהגדרנו שבדיוק בין הגרש גרש הזה אנחנו רוצים לשתול את השם של המוצר ובדיוק כאן אנחנו רוצים לשתול את המחיר שלו, אחרי המחרוזת אנחנו קובעים מה הערכים עצמם.
זה יהיה get name ומיד אחר כך get price והנה יש לנו עכשיו את אותה השאילתה של מקודם אבל קצת יותר קל לבנות אותה.
אחרי שיש לנו את שאילתת ה-SQL, מה שאנחנו רוצים לעשות זה להגיע לרכיב SQLite דאטאבייס, כמו שהיה לנו מקודם SQLite דאטאבייס DB, תחת אותיות קטנות.
מקודם אנחנו קיבלנו את האובייקט הזה לפונקציית onCreate ולפונקציית onUpgrade, ויכלנו להשתמש איתו בשביל לייצר שאילתא. בגלל שאנחנו בונים פונקציה משלנו, אין לנו את האובייקט הזה, אז אנחנו בונים פה משתנה ובאים ל-sqlight open helper וקוראים לפונקציה get writable database.
יש לנו get writable database או get readable database, אם אנחנו רוצים לכתוב או לקרוא. אז אנחנו רוצים את get writable database כי אנחנו רוצים לכתוב לתוך ה-database ואנחנו רוצים לגשת ולקרוא לפונקציה execsql ולתת לה את שאילתת הsql שבנינו.
execsql קח את הסטרינג שבנינו של שפת sql ותוציא אותו לפועל. כלומר, הפונקציה הזאת תכניס לדאטאבייס, לטבלת פרודקטס, רשומה חדשה עם הערכים האלה שקיבלנו כאן.
מה שאנחנו צריכים לעשות עכשיו זה לקחת את ה-ID שהדאטאבייס יצר לנו, שאנחנו לא יודעים מה זה, ולהכניס אותו לתוך האובייקט פרודקט, לתוך המשתנה ID, סט ID, ולתת את ה-ID שהדאטאבייס יצר.
למה? כי אחר כך אנחנו רוצים להציג את כל המידע הזה באקטיביטי, ואנחנו רוצים שהמשתמש יוכל לבצע עדכון או למחוק את המוצר או מוצרים אחרים וכל הסיפור הזה מתבצע לפי ה-ID.
אבל אנחנו חייבים שהדאטאבייס יגיד לנו בחזרה, תקשיב, ה-ID שיצרתי לו זה מספר 17 כי יש לי כבר 17 מוצרים שנוצרו שם או 16 מוצרים אז הנה המוצר הבא זה 17, קח את ה-ID ואז תוכל להשתמש עם ה-ID הזה בשביל לבצע פעולות נוספות על אותו המוצר.
אז הפעולה הבאה שאנחנו רוצים לעשות בתוך הפונקציה add product זה לגשת לדאטאבייס ולהחזיר את המפתח החדש שהדאטאבייס יצר לנו.
ולכן אנחנו צריכים עכשיו לייצר פקודה שכורת מידע. זה יהיה פקודת סלקט. פקודת סלקט מחזירה מידע. אז יש לנו את ה-DB שדרך אגב למרות שהוא רייטאבל אנחנו יכולים להריץ דרכו שאילתות של רידאבל.
והשאילתה שאנחנו רוצים זה raw query כי אנחנו מתעסקים פה בשאילתת sql טהורה שנקראת סלקט ומה אנחנו רוצים לבחור? אנחנו רוצים לבחור פקודה שנקראת last underline insert underline row id. זאת פונקציה למעשה שקיימת בתוך sqlite דאטאבייס ושמחזירה לנו את המספר האוטומטי האחרון שהדאטאבייס יצר לנו.
יש לנו פה עוד כל מיני ארגומנטס שאנחנו לא משתמשים איתם, אנחנו יכולים להעביר נ"ל. והשאלה היא, מה הפונקציה הזאת מחזירה? אז הפונקציה מחזירה אובייקט מאוד חשוב שאנחנו נעבוד איתו בהרחבה בהמשך גם, והאובייקט הזה נקרא קורסור.
בואו נקבל אותו לקורסור, והנה יש לנו כאן שאילתא שמביאה מידע. השאלה ומה זה קורסור? קורסור זה אובייקט שמצביע על טבלה שהוחזרה לנו מהדאטאבייס.
הטבלה הזאת יכולה להיות טבלה שמכילה הרבה עמודות והרבה שורות, היא יכולה להיות טבלה שמכילה עמודה אחת והרבה שורות, או מספר עמודות ושורה אחת, תלוי מה הבאנו, והיא יכולה להיות גם עמודה אחת ושורה אחת, כל דבר כזה זה.
בעצם אפשר להתייחס לזה בתור טבלה שחזרה. הקורסור זה בעצם מצביע שבכל רגע ורגע מצביע על שורה אחת מהמידע שהוחזר כאן, ואנחנו יכולים לקרוא את אותו מידע שקיים בשורה הזאת.
ברגע שסיימנו אנחנו יכולים להזיז את הקורסור הזה שורה אחת קדימה או שורה אחת אחורה, לאן שאנחנו רוצים בשביל לקרוא את השורה הבאה או אפילו שורה לפני זה, או את השורה האחרונה או את השורה הראשונה, תלוי לאן אנחנו זורקים את הקורסור הזה, את הסמן הזה שמצביע תמיד על שורה.
אבל הקורסור תמיד בהתחלה מצביע על שורה וירטואלית שנמצאת לפני השורה הראשונה. לכן הפעולה הראשונה שאנחנו צריכים לעשות עם הקורסור זה לזרוק אותו move next שורה אחת קדימה וזה יהיה go to the first line בגלל שבהתחלה בהתחלה איך שהבאנו את הקורסור הוא עדיין לא מצביע על השורה הראשונה אלא על
שורה וירטואלית שנמצאת לפניה הפקודה הזאת תזיז אותו לשורה הראשונה. אם הוא מצביע על השורה הראשונה אנחנו יכולים לקרוא את המידע מהשורה הזאת ואנחנו רוצים לבוא לקורסור שלנו ולקרוא סטרינג או אינט או בלוב או כל מה שאנחנו רוצים,