• Programmazione Android
  • CORSI ONLINE
  • Web Agency

Logo

Corsi di programmazione web e mobile online
Navigation
  • Home
  • CORSI ONLINE
  • Tutorial Pratici
  • GUIDE COMPLETE
    • Corso completo di C
    • Corso videogame con Cocos2d
    • Programmazione Cocoa Touch
  • Sezioni
    • Libri e manuali
    • Tips & Tricks
    • Risorse utili
    • Strumenti di Sviluppo
    • Materiale OpenSource
    • Framework
    • Guide Teoriche
    • Guide varie
    • Grafica e Design
    • iPad
    • News
    • Video Tutorial
    • Windows Phone
  • Pubblicità
  • About
    • Chi siamo
    • Pubblicazioni
    • Collabora
    • Sostieni devAPP

Content Provider: introduzione alla condivisione di dati in Android

By Giuseppe Maggi | on 11 Maggio 2017 | 0 Comment
Android
Tutorial Content Provider Android

Tutte le applicazioni Android devono avere cura dei dati che gestiscono, in qualunque maniera siano immagazzinati. Considerando che nessuna app può mettere le mani nelle informazioni custodite da un’altra è previsto un meccanismo ufficiale di sistema per la condivisione di dati: i Content Provider.

Si tratta di componenti – alla pari di Service, Activity e Broadcast Receiver – che permettono di leggere e modificare dati presenti in una determinata sorgente, inviando chiamate ad un indirizzo univoco, detto URI. I comandi passati rispecchiano le quattro operazioni CRUD eseguibili sui database (Create, Read, Update, Delete).

I Content Provider vengono utilizzati in vari ambiti:

  • per condividere basi di dati di utilità generale presenti nel sistema operativo: si pensi ai Contatti, al dizionario utente, al Calendario e molto altro;
  • per fare in modo che più applicazioni possano condividere gli stessi dati, cosa che capita spesso quando più app provengono dallo stesso produttore;
  • come elemento architetturale interno ad un’app articolata in cui più componenti accedono agli stessi dati.

In questo post, prenderemo contatto con i concetti fondamentali di questo strumento e li sperimenteremo interrogando un Content Provider messo a disposizione da Android che rappresenta la sorgente dati delle Impostazioni di sistema.

Accesso ai dati: ContentResolver e URI

L’accesso ad un ContentProvider non differisce molto da quello ad un comune database Sqlite: accederemo alle risorse con metodi omonimi a quelli utilizzati nella classe SqliteDatabase e, per le query, otterremo come risultato un Cursor che potremo legare ad un’interfaccia utente con un CursorAdapter.

L’oggetto che permette di invocare un ContentProvider è il ContentResolver di cui otterremo un riferimento dal Context tramite il metodo getContentResolver. L’indirizzo che permetterà di identificare univocamente il Content Provider al quale siamo interessati è rappresentato da un URI che, nelle invocazioni, svolgerà un ruolo simile a quello svolto dal nome della tabella da leggere o modificare nell’utilizzo dei database.

Per ogni Content Provider possono esistere più URI che indicheranno risorse diverse: chi ha esperienza di backend web troverà molte affinità tra Content Provider e API REST per l’accesso ai dati.

Esempio: accedere alle Impostazioni di sistema

In Android, le Impostazioni di sistema vengono offerte come Content Provider. In casi come questo, dove si tratta di informazioni molto utili, si dà la possibilità di accedervi inviando delle richieste all’URI tramite ContentResolver o, in alternativa, mettendo a disposizione dei metodi di utilità. Le Impostazioni di sistema sono essenzialmente proprietà costituite da coppie chiave/valore: una stringa rappresenta la chiave (il nome della proprietà), un’altra stringa o un numero (intero o con virgola) ne rappresenta il valore. Pertanto esistono metodi come getInt(ContentResolver cr, String name) che leggerà una proprietà con valore Integer di cui forniremo il nome ed il ContentResolver relativo al nostro Context oppure putInt(ContentResolver cr, String name, int value) con cui assegneremo il valore value alla proprietà di nome name: la presenza del ContentResolver rivela l’utilizzo di un ContentProvider.

Noi, però, in questo esempio eviteremo di utilizzare metodi di comodità facendo accesso direttamente al Content Provider: il nostro scopo sarà quello di ottenere una lista delle proprietà di sistema del dispositivo.

Tutto il codice che usiamo è inserito nel metodo onCreate dell’Activity. Per compattezza non useremo nemmeno un file esterno per il layout ma una ListView istanziata direttamente come oggetto:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // creiamo una ListView che diventa il layout dell'app
        ListView lv=new ListView(this);
        setContentView(lv);

        // leggiamo dal ContentProvider la lista
        // delle proprietà di sistema con relativi valori
        Cursor crs=getContentResolver().query(
                Settings.System.CONTENT_URI,
                null,
                null,
                null,
                null

        );

        // usiamo un normale SimpleCursorAdapter per leggere il Cursor
        SimpleCursorAdapter adapter=new SimpleCursorAdapter(
                this,
                android.R.layout.simple_list_item_2,
                crs,
                new String[]{"name", "value"},
                new int[]{android.R.id.text1,android.R.id.text2},
                0
        );

        // leghiamo il CursorAdapter alla ListView
        lv.setAdapter(adapter);
    }
}

Per chi è abituato ad utilizzare i database Sqlite in Android, il codice appare molto familiare, l’unico vero punto di novità è la riga:

Cursor crs=getContentResolver().query(
                Settings.System.CONTENT_URI,
                null,
                null,
                null,
                null

        );

dove effettuiamo una query, ottenendo un Cursor, ma inoltrandola tramite ContentResolver. Anche l’URI sarà ottenuto da una classe del SDK, essendo una costante di Settings.System. I parametri successivi impostati a null occuperanno il posto riservato, rispettivamente, ad un array di String che fungerà da proiezione, una stringa ed un altro array di String che insieme costituiranno il corpo della clausola WHERE (nello stile parametrico di SqliteDatabase) ed un ulteriore oggetto String che fornirà le impostazioni della clausola ORDER BY.

Il risultato apparirà così:

Ogni riga fornisce una proprietà (registrata tra le costanti disponibili nella classe Settings.System) ed il valore.

Osserviamo da vicino una proprietà a titolo di esempio. Questo è ciò che appare a proposito della lingua impostata nel dispositivo (l’emulatore è in italiano):

Apriamo l’app per le Impostazioni di sistema e andiamo a scegliere una seconda lingua (sistema operativo Android 7.0). Prendiamo ad esempio l’inglese:

Ricarichiamo l’app e verifichiamo se la modifica è stata apportata:

Come possiamo vedere, il valore è già cambiato ed, in particolare, rileva la scelta della lingua inglese.

Conclusioni

Quanto abbiamo visto è solo un’introduzione all’argomento corredata da una rapida dimostrazione ma per sperimentare le potenzialità dei Content Provider e comprendere perché essi costituiscano una pietra miliare dell’ecosistema Android il nostro discorso dovrà necessariamente andare avanti.

Nei prossimi articoli vedremo come poter modificare i dati offerti da importanti Content Provider di sistema e, soprattutto, come mettere in condivisione dati creando componenti di questo tipo nei nostri progetti.

A presto!

Share this story:
  • tweet

Tags: androidcontent providerDatabasedatabase sqliteTutorial Pratici

Recent Posts

  • Parte il percorso programmatori iOS in Swift su devACADEMY.it

    20 Dicembre 2017 - 0 Comment
  • Android, crittografare dati velocemente con Encryption

    24 Settembre 2018 - 0 Comment
  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • Okio, libreria per ottimizzare l’input/output in Java

    27 Agosto 2018 - 0 Comment

Related Posts

  • Sql2o, accesso immediato ai database tramite Java

    3 Settembre 2018 - 0 Comment
  • IntelliJ IDEA: IDE per programmare in Java e Kotlin

    25 Luglio 2018 - 0 Comment
  • Android: usare Connect Pattern

    10 Luglio 2018 - 0 Comment

Author Description

No Responses to “Content Provider: introduzione alla condivisione di dati in Android”

Leave a Reply

Your email address will not be published. Required fields are marked *


*
*

Corso online di programmazione android e java

SEZIONI

  • Android
  • Comunicazioni
  • Contest
  • Corsi ed Eventi
  • Corso completo di C
  • Corso programmazione videogiochi
  • Framework
  • Grafica e Design
  • Guida rapida alla programmazione Cocoa Touch
  • Guide Teoriche
  • Guide varie
  • iPad
  • Le nostre applicazioni
  • Libri e manuali
  • Materiale OpenSource
  • News
  • Pillole di C++
  • Progetti completi
  • Risorse utili
  • Strumenti di Sviluppo
  • Swift
  • Tips & Tricks
  • Tutorial Pratici
  • Video Tutorial
  • Windows Phone

Siti Amici

  • Adrirobot
  • Allmobileworld
  • Apple Notizie
  • Apple Tribù
  • Avvocato360
  • Blog informatico 360°
  • bubi devs
  • fotogriPhone
  • GiovaTech
  • iApp-Mac
  • iOS Developer Program
  • iPodMania
  • MelaRumors
  • Meritocracy
  • SoloTablet
  • TecnoUser
  • Privacy & Cookie Policy
©2009-2018 devAPP - All Rights Reserved | Contattaci
devAPP.it è un progetto di DEVAPP S.R.L. - Web & Mobile Agency di Torino
Str. Volpiano, 54 - 10040 Leini (TO) - C.F. e P.IVA 11263180017 - REA TO1199665 - Cap. Soc. € 10.000,00 i.v.

devACADEMY.it

Vuoi imparare a programmare?

Iscriviti e accedi a TUTTI i corsi con un’unica iscrizione.
Oltre 70 corsi e migliaia di videolezioni online e in italiano a tua disposizione.

ISCRIVITI SUBITO