Android Development - Smart Community Lab Wiki

@ 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.
*
*