
contact_id, והיא מצביעה על _id מטבלת אנשי הקשר. שם העמודות יכול להיות שונה בין הטבלאות. ה-URI של הטבלה השנייה מתחיל באותו authority, com.android.contacts, אבל הנתונים הם data/emails.ArrayList<String> של אימיילים, פונקציה addEmail שמוסיפה כתובת אחת, ו-toString מעודכנת: השם, ירידת שורה, ואז כל אימייל עם tab וירידת שורה.ContactsContract.CommonDataKinds.Email.CONTENT_URI, עמודת איש הקשר CONTACT_ID ועמודת הכתובת ADDRESS. בטבלה עצמה שם העמודה הוא data1, אבל זה לא משנה כי משתמשים בקבוע.query על טבלת האימיילים עם selection שבו עמודת ה-contact id שווה ל-ID של איש הקשר הנוכחי. כך מקבלים רק את האימיילים שלו.while ו-moveToNext (כי יכולים להיות כמה), וקוראים כל כתובת עם getString ומוסיפים אותה ל-Contact עם addEmail.emailsCursor אחרי הלולאה.הטקסט המלא של הדקות הראשונות בהרצאה «Content Provider - חלק 5» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כעת בואו נראה איך בנוסף לשליפת ה-contact names אנחנו יכולים לשלוף גם את האימיילים. לצורך כך אנחנו צריכים להבין איך האימיילים שמורים בתוך האפליקציה של ה-contacts. אז יש לנו פה מסמך word שבנוסף לטבלת ה-contact שראינו אותה בסרטון הקודם אנחנו רואים גם טבלה נוספת של אימיילים.
עכשיו למה זה מופרד לטבלה נוספת כביכול ולא באותה הטבלה? יכול להיות שלקונטקט אחד יש מספר אימיילים הנה כאן לדוגמה אנחנו רואים שלמוישה יש אימייל אחד אבל לקיפי שהוא איידי 2 יש שני אימיילים עכשיו חשוב להבין שהשמות של העמודות יכולות להיות שמות שונים הנה בטבלת הקונטקט אנחנו רואים שהקוד של כל קונטקט הוא underline ID אבל העמודה המקבילה שנמצאת בטבלת
האימיילים נקראת Contact Underline ID והיא בעצם מכילה את הערכים המתאימים מה-IDs שבטבלת ה-Contact. לדוגמה אם מוישה אופניק הוא אחד אז כאן ב-Contact ID אנחנו רואים אחד והנה האימייל שלו.
אם קיפי הוא שתיים אז אנחנו רואים שבטבלת האימיילים פה יש שתי רשומות שהוא שתיים זאת אומרת ששתי הרשומות האלה מתארות את קיפי שפה נמצא שתיים.
בעצם אנחנו רואים שלוש רשומות, זאת אומרת שלקיפי יש שלושה אימיילים. לאוגי יש אימייל אחד ולקרמיט דה פרוג יש אימייל אחד והנה אנחנו רואים שלמיס פיגי שפה היא חמש יש שני אימיילים.
זאת הסיבה שיש לנו כאן עוד טבלה ולכן הקוד הופך להיות טיפה יותר מורכב כי אנחנו צריכים להשיג קודם כל את ה-ID של הקונטקט ולפי ה-ID הזה להשיג את המידע הרצוי מהטבלה השנייה.
כאן אנחנו רואים שה-URI של הטבלה השנייה זה אותה התחלה content.com.android.contacts אבל ה-data זה כבר לא contact אלא נקרא data/emails. אוקיי אז בואו כבר נבצע את השינויים הדרושים בשביל להצליח להוציא את האימיילים עבור כל אחד מהקונטקטס.
והשינוי הראשון שאנחנו צריכים זה לגשת לטבלת הקונטקט, או ליתר דיוק למחלקה של הקונטקט, ולהוסיף כאן private arraylist של סטרינג, אימיילס שווה new arraylist בצורה כזאת.
למה? כי אנחנו רוצים שלקונטקט אחד יוכלו להיות כמה אימיילים. מה שאנחנו רוצים להוסיף בנוסף לזה זאת פונקציה שלא מחזירה כלום ונקראת addEmail, שנוכל דרכה להוסיף E-Mail אחד ויחיד.
אנחנו רוצים לפנות ל-E-Mails, addE-Mail אחד ויחיד. אנחנו רוצים את ה-toString לשנות גם כן, יש לנו פה String Str, ניתן שיהיה בה את ה-Name, משורשר עם איזה ירידת שורה, ואנחנו רוצים for each string email in רשימת האימיילים, נשים את הכל באותה שורה,
לגשת ל-str ולצרף, בואו נעשה איזה backslash t כזה, שזה tab, ואז את האימייל, וירידת שורה, backslash n.
לבסוף נחזיר את המחרוזת שיצרנו. אז כעת המחלקה contact מוכנה, אנחנו יכולים לגשת לקונטקטס מנג'ר ששלף רק את רשימת הקונטקטס ולהמשיך ולאכלס גם את האימיילים של כל קונטקט.
ואנחנו מתחילים בקבועים. כאן אנחנו צריכים שיהיו לנו קבועים שמתארים גם את רשימת האימיילים. אז בואו נעתיק את ה-URI הזה וזה יהיה לא קונטקטס טייבל אלא E-Mails טייבל והקבוע שמצביע עליו זה contactscontracts נקודה כאן זה נקרא common data kind.email זאת טבלת האימיילים ויש לנו content URI. בואו ניפטר מזה ולמעשה
פה אנחנו ניגשים ל-com android contacts שם היה לנו דאטה סלאש אימיילס ניפטר מכל היתר וזאת בעצם המחרוזת שזה יביא לנו, מחרוזת ה-URI.
הקבוע הבא שאנחנו רוצים, בואו נעתיק לדוגמה את המחרוזת הזאת של ה-ID, נדביק אותה ומה שאנחנו רוצים זה גישה ל-Emails טייבל וב-Emails טייבל אנחנו רוצים את Contact ID column.
זה נמצא בcontact.common.datacounts.email.contact. underline.id והקבוע הזה למעשה אחרי שבדקתי הוא נקרא contact.underline.id נשכפל בתוך emails table יש לנו גם את הקבוע של האימייל אז זה בעצם יהיה אימייל column ואנחנו רוצים לגשת ולהגיע לאדרס, זה בעצם הקבוע,
אבל בטבלה זה היה data1, זאת השם של העמודה, זה השם של העמודה, אפשר לראות את זה בסכמה שמצאתי, data1 זה היה השם, אבל מבחינתנו זה פחות משנה איך הם קוראים לזה, יש לנו את האדרס וזה בעצם השם של עמודת האימייל, עצמו.
Good. אז הנה יש לנו את שלושת הקבועים הבאים: יש לנו בתוך הפונקציה getContacts את ה-ArrayList של כל ה-contacts, יש לנו את ה-contentProvider, קיבלנו קורסור לרשימת ה-contacts וזאת רשימה נפרדת מהאימיילים, הנה בעצם שני האינדקסים של ה-ID ושל ה-Name ומה
שאנחנו רוצים זה עכשיו להוציא את הערכים עצמם, הנה ה-ID של הקונטקט, הנה ה-Name שלו, הנה יצירה של אובייקט הקונטקט.