E' da pochissimo che mi sono avvicinato alla programmazione di applicazioni per Android. Una delle prime cose che ho voluto sperimentare è stata l' interazione con il database interno che contiene tutti i dati dei contatti. E devo dire che ho trovato non poche difficoltà nel capirne la struttura e le classi utilizzate per interagire con i dati. Vediamo pertanto di chiarire alcuni concetti base.
Struttura delle tabelle contatti.
Diciamo subito che Android utilizza SQLLite per la gestione dei database. Tramite le classi ContactsContract abbiamo la possibilità di interagire con i contatti utilizzando funzionalità già predisposte nelle classi medesime.Sicuramente, avrete già visto questa figura:
essa rappresenta la struttura interna del database che contiene i contatti. La prima tabella, Contact, contiene un record per ogni persona ed ogni record contiene i seguenti campi:
Campo times_contacted | 0 | |
Campo contact_status | null | |
Campo custom_ringtone | null | |
Campo has_phone_number | 1 | |
Campo phonetic_name | null | |
Campo phonetic_name_style | 0 | |
Campo contact_status_label | null | |
Campo lookup | 1037ioDw%2FXS5xTS6ScmWkmdoebw%3D%3D | |
Campo contact_status_icon | null | |
Campo last_time_contacted | 0 | |
Campo display_name | Alice nel paese delle meraviglie | |
Campo sort_key_alt | Alice nel paese delle meraviglie | |
Campo in_visible_group | 1 | |
Campo _id | 21 | |
Campo starred | 0 | |
Campo sort_key |
|
|
Campo display_name_alt |
|
|
Campo contact_presence | null | |
Campo display_name_source | 40 | |
Campo contact_status_res_package | null | |
Campo contact_chat_capability | null | |
Campo contact_status_ts | null | |
Campo photo_id | null | |
Campo send_to_voicemail | 0 |
Ho evidenziato alcuni campi: per esempio il campo "display_name" che contiene il nome della persona e il campo forse più importate "_id". vediamo ora come è relazionata questa tabella con la tabella "raw contact".
Campo times_contacted | 0 |
Campo phonetic_name | null |
Campo phonetic_name_style | 0 |
Campo contact_id | 21 |
Campo version | 5 |
Campo last_time_contacted | 0 |
Campo aggregation_mode | 0 |
Campo _id | 34 |
Campo name_verified | 0 |
Campo display_name_source | 40 |
Campo dirty | 0 |
Campo send_to_voicemail | 0 |
Campo account_type | com.motorola.blur.provider.activesync |
Campo custom_ringtone | null |
Campo sync4 | 0 |
Campo sync3 | EAS |
Campo sync2 | oDw/XS5xTS6ScmWkmdoebw |
Campo sync1 | 5 |
Campo deleted | 0 |
Campo account_name | [email protected] |
Campo display_name | Alice nel paese delle meraviglie |
Campo sort_key_alt | nel paese delle meraviglie,Alice |
Campo starred | 0 |
Campo sort_key | Alice nel paese delle meraviglie |
Campo display_name_alt | nel paese delle meraviglie,Alice |
Campo sourceid | oDw/XS5xTS6ScmWkmdoebw |
Come potete vedere (fidatevi!), nella tabella "raw contact" troviamo un solo record relazionato con la tabella "contact". Questo record , infatti, riporta sul campo "contact_id" il valore 21 (che corrisponde al campo _id della tabella contact). Possiamo notare che il nostro contatto "Alice nel paese delle meraviglie" con _id = 21 è riferito all' account email [email protected] . Ciò significa che nel nostro dispositivo Android, abbiamo questo account email configurato e sincronizato con il server email. Pertanto la lista dei contatti presenti sul server, viene replicata (sincronizzata) anche sul nostro dispositivo Android.
Il fatto che sia presente un solo record, sta ad indicare che, quella persona (Alice nel paese delle meraviglie), non è presenti in evetuali altri account (di posta elettronica, fecebook, etc) sul nostro dispositivo Android. Così semplifichiamo un po'....
Vediamo ora l' ultima tabella , "data", e come è relazionata con la tabella "raw contact". Premetto subito che saranno presenti più record "data" per il singolo "raw contact". Analizziamo il primo:
Campo data_version | 0 |
Campo phonetic_name | null |
Campo phonetic_name_style | 0 |
Campo contact_id | 21 |
Campo lookup | 1037ioDw%2FXS5xTS6ScmWkmdoebw%3D%3D |
Campo data12 | null |
Campo data11 | 0 |
Campo data10 | 1 |
Campo mimetype | vnd.android.cursor.item/name |
Campo data15 | null |
Campo data14 | null |
Campo data13 | null |
Campo display_name_source | 40 |
Campo data_sync1 | null |
Campo data_sync3 | null |
Campo data_sync2 | null |
Campo contact_chat_capability | null |
Campo data_sync4 | null |
Campo account_type | com.motorola.blur.provider.activesync |
Campo custom_ringtone | null |
Campo status | null |
Campo data1 | Alice nel paese delle meraviglie |
Campo data4 | null |
Campo data5 | null |
Campo data2 | nel paese delle meraviglie, Alice |
Campo data3 | |
Campo data8 | null |
Campo data9 | null |
Campo group_sourceid | null |
Campo data6 | null |
Campo account_name | [email protected] |
Campo data7 | null |
Campo display_name | Alice nel paese delle meraviglie |
Campo in_visible_group | 1 |
Campo display_name_alt | nel paese delle meraviglie, Alice |
Campo contact_status_res_package | null |
Campo is_primary | 0 |
Campo contact_status_ts | null |
Campo raw_contact_id | 34 |
Campo times_contacted | 0 |
Campo contact_status | null |
Campo status_res_package | null |
Campo status_icon | null |
Campo contact_status_icon | null |
Campo mode | null |
Campo version | 5 |
Campo last_time_contacted | 0 |
Campo res_package | blur_common |
Campo _id | 149 |
Campo name_verified | 0 |
Campo status_ts | null |
Campo dirty | 0 |
Campo is_super_primary | 0 |
Campo photo_id | null |
Campo send_to_voicemail | 0 |
Campo name_raw_contact_id | 34 |
Campo contact_status_label | null |
Campo status_label | null |
Campo sort_key_alt | nel paese delle meraviglie, Alice |
Campo starred | 0 |
Campo sort_key | Alice nel paese delle meraviglie |
Campo contact_presence | null |
Campo sourceid | oDw/XS5xTS6ScmWkmdoebw |
Notiamo subuto che questo record ha il campo "raw_contact_id" con valore 34, il che significa che è un record "data" riferito ad un determinato contatto e quindi alla tabella "raw contact" e di questa tabella, al record con campo "_id" con valore 34. Altro campo molto importante dei record contenuti nella tabella "data" è il campo "mimetype". Questo campo, stabilisce la tipologia di dato contenuto nel record della tabella "data". Nel caso riportato quì sopra, notiamo che questo record "data" è caratterizzato con un mimetype nativo android di tipologia "name". Questo record, quindi, contiene il nome del contatto che è il campo "data1".
La possibilità di caratterizzare ogni singolo record "data" con un mimetype , i campi da data1 a data15, rendono chiaro e fanno capire la flessibilità e potenza che è racchiusa in questa tipologia di struttura. Tramite opportune classi è infatti possibile aggiungere una particolare caratterizzazione ad un contatto , per esempio aggiungendo un record "data" con un mimetype "nostro" utile all' applicazione che stiamo sviluppando.
Ritornando al nostro esempio, dicevamo che per il nostro contatto "Alice nel paese delle meraviglie", sono presenti diversi record "data": analizzaimone un secondo.
Campo data_version | 1 |
Campo phonetic_name | null |
Campo phonetic_name_style | 0 |
Campo contact_id | 21 |
Campo lookup | 1037ioDw%2FXS5xTS6ScmWkmdoebw%3D%3D |
Campo data12 | null |
Campo data11 | null |
Campo data10 | null |
Campo mimetype | vnd.android.cursor.item/phone_v2 |
Campo data15 | null |
Campo data14 | null |
Campo data13 | null |
Campo display_name_source | 40 |
Campo data_sync1 | null |
Campo data_sync3 | null |
Campo data_sync2 | null |
Campo contact_chat_capability | null |
Campo data_sync4 | null |
Campo account_type | com.motorola.blur.provider.activesync |
Campo custom_ringtone | null |
Campo status | null |
Campo data1 | 335xxxxxxx |
Campo data4 | 8701967533 |
Campo data5 | null |
Campo data2 | 2 |
Campo data3 | null |
Campo data8 | null |
Campo data9 | null |
Campo group_sourceid | null |
Campo data6 | null |
Campo account_name | [email protected] |
Campo data7 | null |
Campo display_name | Alice nel paese delle meraviglie |
Campo in_visible_group | 1 |
Campo display_name_alt | nel paese delle meraviglie, Alice |
Campo contact_status_res_package | null |
Campo is_primary | 1 |
Campo contact_status_ts | null |
Campo raw_contact_id | 34 |
Campo times_contacted | 0 |
Campo contact_status | null |
Campo status_res_package | null |
Campo status_icon | null |
Campo contact_status_icon | null |
Campo mode | null |
Campo version | 5 |
Campo last_time_contacted | 0 |
Campo res_package | blur_common |
Campo _id | 151 |
Campo name_verified | 0 |
Campo status_ts | null |
Campo dirty | 0 |
Campo is_super_primary | 0 |
Campo photo_id | null |
Campo send_to_voicemail | 0 |
Campo name_raw_contact_id | 34 |
Campo contact_status_label | null |
Campo status_label | null |
Campo sort_key_alt | nel paese delle meraviglie, Alice |
Campo starred | 0 |
Campo sort_key | Alice nel paese delle meraviglie |
Campo contact_presence | null |
Campo sourceid | oDw/XS5xTS6ScmWkmdoebw |
Questo record contiene un numero telefonico (vedi campo "mimetype" e "data1") del contatto "Alice nel paese delle meraviglie". Analizziamo ancora un altro record "data" del contatto "Alice nel paese delle meraviglie".
Campo data_version | 0 |
Campo phonetic_name | null |
Campo phonetic_name_style | 0 |
Campo contact_id | 21 |
Campo lookup | 1037ioDw%2FXS5xTS6ScmWkmdoebw%3D%3D |
Campo data12 | null |
Campo data11 | null |
Campo data10 | null |
Campo mimetype | vnd.android.cursor.item/email_v2 |
Campo data15 | null |
Campo data14 | null |
Campo data13 | null |
Campo display_name_source | 40 |
Campo data_sync1 | null |
Campo data_sync3 | null |
Campo data_sync2 | null |
Campo contact_chat_capability | null |
Campo data_sync4 | null |
Campo account_type | com.motorola.blur.provider.activesync |
Campo custom_ringtone | null |
Campo status | null |
Campo data1 | [email protected]>.it |
Campo data4 | [email protected] |
Campo data5 | null |
Campo data2 | 2 |
Campo data3 | null |
Campo data8 | null |
Campo data9 | null |
Campo group_sourceid | null |
Campo data6 | null |
Campo account_name | [email protected] |
Campo data7 | null |
Campo display_name | Alice nel paese delle meraviglie |
Campo in_visible_group | 1 |
Campo display_name_alt | nel paese delle meraviglie, Alice |
Campo contact_status_res_package | null |
Campo is_primary | 0 |
Campo contact_status_ts | null |
Campo raw_contact_id | |
Campo times_contacted | 0 |
Campo contact_status | null |
Campo status_res_package | null |
Campo status_icon | null |
Campo contact_status_icon | null |
Campo mode | null |
Campo version | 5 |
Campo last_time_contacted | 0 |
Campo res_package | blur_common |
Campo _id | 152 |
Campo name_verified | 0 |
Campo status_ts | null |
Campo dirty | 0 |
Campo is_super_primary | 0 |
Campo photo_id | null |
Campo send_to_voicemail | 0 |
Campo name_raw_contact_id | 34 |
Campo contact_status_label | null |
Campo status_label | null |
Campo sort_key_alt | nel paese delle meraviglie, Alice |
Campo starred | 0 |
Campo sort_key | Alice nel paese delle meraviglie |
Campo contact_presence | null |
Campo sourceid | oDw/XS5xTS6ScmWkmdoebw |
Questo record contiene un indirizzo email (vedi campo "mimetype" e "data1") del contatto "Alice nel paese delle meraviglie".
Per quanto riguarda l' interazione con i record "data" con mimetype nativi android, sappiamo che esistono classi native android che ci permettono di interagire agevolmente con questa tipologia di record.
Bene, spero che questo articolo possa aver reso più chiaro come Android struttura i dati dei contatti. A questo punto, se vogliamo mettere in pratica ciò che abbiamo visto in questo articolo, nel successivo mostrerò alcuni esempi di codice utili per interagire con i contatti. Grazie per la lettura.
Pensi che questo articolo possa essere d' aiuto anche ad altri? Allora condividilo subito nel tuo social preferito.
Tweet Segui @Dillofacile
Lascia i tuoi commenti
Login per inviare un commento
Posta commento come visitatore