@ ITT M. BUONARROTI, TRENTO ANDROID DEVELOPMENT PERSISTENZA RAMAN KAZHAMIAKIN OSCAR ZAMBOTTI @oskarnrk GIOVANNI DE FRANCESCO @jibbolus * Sommario 1. SharedPreferences 2. I Database (accenni) 3. SQLite 4. ContentProvider * * Persistenza in Android Android permette di salvare dati dell’app nel filesystem. Per ogni app il sistema crea una cartella: data/data/[package] Android supporta questi modi di persistenza: Files Puoi creare e aggiornare files. Salvati nella cartella files Preferences Android ti permette di salvare e leggere coppie chiave-valore di tipi primitivi. Salvate in XML nella cartella shared_prefs Database SQLite anche le istanze di databaseSQLite sono salvate nel filesystem. Salvati nella cartella databases. Content Provider Un layer d’astrazione sopra un DB che permette di condividere i contenuti con altre app (esempio: contatti). • • • • * * Files * * Preferences Android supporta l’uso della classe SharedPreferences per la persistenza di coppie chiave-valore (preferenze) di tipi di dati primitivi nel file system. Questo può essere una grande limitazione. La definizione di queste preferenze può essere fatta con un file XML. La classe PreferenceManager fornisce dei metodi per accedere alle preferenze salvate in un certo file. * * Preferences #2 Ecco come ottenere le preferences da un file: SharedPreferences settings; settings = getSharedPreferences("Test", Context.MODE_PRIVATE); NB: le preferences sono solitamente create come private e vi si può accedere da ogni componente dell’applicazione. Condividere questi dati con altre applicazioni con permessi di lettura (e/o scrittura da parte di tutti è una pratica utilizzata raramente, anche perché il componente esterno ha bisogno di sapere esattamente nome e posizione del file. * * Preferences #3 In ogni componente è possibile accedere alle preferences in questo modo: SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getActivity()); # ottieni il valore per una certa chiave # e indica anche un valore di default String url = settings.getString("url", "n/a"); Per creare o modificare le preferences bisogna • chiamare il metodo edit() di SharedPreferences per ottenere un Editor • utilizzare il metodo apply() che salva in maniera asincrona nel file system. • Usare il metodo commit() non è cosa buona in quanto il salvataggio è sincrono. Editor edit = settings.edit(); edit.putString("url", "http://www.smartcampuslab.it"); edit.apply(); * * Preferences #4 È possibile monitorare i cambiamenti alle preferences usando il metodo registerOnSharedPreferenceChangeListener() di SharedPreferences. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.OnSharedPreferenceChangeListener listener;// Istanza di listener listener = new SharedPreferences.OnSharedPreferenceChangeListener(){ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { // ah, è cambiata quella chiave!!! } }; prefs.registerOnSharedPreferenceChangeListener(listener); * * I DATABASE (accenni) Un database è un archivio dove possiamo salvare dei dati e collegarli tra di loro secondo un modello logico. Per esempio una rubrica telefonica è un database. Uno dei modi per poter ricercare un dato all’interno di un database è quello di utilizzare il linguaggio SQL. * * Le Tabelle Unità di base dei Database di tipo relazionale. Un esempio: * * SQL: i comandi più frequenti ● CREATE TABLE nome (campo1 tipo1, campo2 tipo2,...); ● SELECT * FROM nometabella; ● INSERT INTO nometabella VALUES (...); ● UPDATE tabella ○ SET campo=nuovoValore1, campo2=nuovoValore2 ○ WHERE id=1; ● DELETE FROM tabella WHERE id=1; Per saperne di più su sql trovate informazioni qui: http://www.w3schools.com/sql/default.asp?PHPSESSID=300ae3404d5fa2612f238abeebb8869c * * SQLite È un database relazionale di pubblico dominio che conserva i suoi dati in un unico file. Su android questo database è integrato nel sistema e può essere utilizzato “gratis”. Ogni applicazione può avere uno o più database questo tipo. * * Modo di utilizzo su Android (parte 1) 1) Creare una nuova classe che estende SQLiteOpenHelper 2) fare l’Override del seguente metodo: a) onCreate fare le operazioni per configurare il database (ndr. creare le tabelle) b) onUpdate fare le operazioni di aggiornamento del database (serve se si hanno diverse versioni della app) LASCIATELO VUOTO! * * Modo di utilizzo su Android (parte 2) 3. Usare il metodo: a.sqlitedb.execSql(sqlString,new String[]{}) per le operazioni che non danno nessun risultato b.sqlitedb.rawQuery(sqlString) per eseguire un comando che restituisce risultato (es. SELECT). 4. Ciclare sul Cursor che ci viene restuito per estrarre i risultati. Nota: esistono anche i metodi di convenienza: insert,update,delete * * Esempio di Helper: * * Esempio di utilizzo: * * Content Provider Un database SQLite è privato nell’applicazione che lo crea. Se si vuole condividere i dati contenuti nel database con altre applicazioni è possibile usare un content provider. Il content provider è un buon metodo per condividere con altre applicazioni dati in maniera strutturata. Il content provider può essere utilizzato all’interno dell’applicazione stessa per accedere ai dati. * * Content Provider #2 Bisogna anche dichiarare il proprio ContentProvider in AndroidManifest.xml. È necessario specificare l’attributo android:authorities che identifica il ContentProvider (univoco). <provider android:authorities="com.exampe.contentprovider" android:name=".contentprovider.MyContentProvider" android:exported="true" > </provider> * * Content Provider #3 Per creare un content provider bisogna definire una classe che estende android.content.ContentProvider. È necessario implementare diversi metodi, es. query(), insert(), update(), delete(), getType() e onCreate(). Nel caso un metodo non sia supportato è meglio lanciare l’eccezione anUnsupportedOperationException(). Il metodo query() deve restituire un oggetto Cursor. * *