際際滷

際際滷Share a Scribd company logo
Android @Tulug
Lezione 4
By IvanGualandri
Twitter: @Italialinux
Agenda
 Gestione dello storage
 SharedPreferences
 Assets
 SQLite (un occhiata veloce)
Riassunto
 Nelle ultime lezioni abbiamo visto,
come aggiungere componenti grafici
ad un applicazione, come farli
interagire mediante bottoni, come
utilizzare alcune funzioni specifiche
del telefonino (invio/ricezione sms)
Introduzione allo storage
Introduzione allo Storage
 Android mette a disposizione diverse
possibilit叩 per salvare informazioni
persistenti sul telefonino. Le principali
sono:
 SharedPreferences
 Assets
 Memoria interna (dentro res)
 SQLite
Introduzione allo Storage/1
 SharedPreferences: non serve per
salvare files, ma per salvare
informazioni di configurazione
dell'applicazione. O comunque dei
dati sotto forma primitiva (numeri,
stringhe, etc).
 Esempio? Se l'applicazione 竪 la
prima volta che si avvia.
 Assets: Viene usato quando
vogliamo salvare i files da utilizzare
in maniera "grezza" dall'applicazione.
 Quali per esempio: files di testo,
caratteri, brani musicali, etc.
 Se li mettessimo in /res android li
proesserebbe mediante il suo
resource system.
Introduzione allo Storage/2
 SQLite: Un vero e proprio database
relazionale, quindi cosa dire di pi湛?
Si usa quando le informazioni si
possono rappresentare mediante
tabelle, e si vogliono fornire funzioni
veloci di interrogazione, ordinamento,
etc.
Introduzione allo Storage/3
 Memoria interna: In questo caso si
sfrutta la cartella resources, e quindi
il dato risiede nella cosiddetta
memoria interna. Rende l'accesso
dei dati da parte dell'applicazione pi湛
semplice. Il problema 竪 che molti
telefonini hanno la memoria interna
molto limitata.
Introduzione allo Storage/4
SharedPreferences...
 Questa modalit叩 ci permette di
salvare dei tipi di dato primitivo nella
modalit叩:
chiave - valore
 Per dati primitivi intendiamo: interi,
stringhe, booleani, etc.
SharedPreferences
 Esistono due tipi:
 SharedPreferences: Sono
informazioni disponibili per tutte le
componenti dell'applicazione
 Preferences: Sono invece disponibili
solamente dalla singola activity
Noi vedremo solo le shared.
SharedPreferences/2
 Ovviamente le due operazioni che
possiamo fare sono leggere o
scrivere valori.
 Per la prima basta solo l'accesso
all'oggetto SharedPreferences,
 Per la seconda invece dobbiamo
utilizzare: SharedPreferences.Editor
SharedPreferences/3
 Della creazione/accesso all'oggetto se ne
occupa l'applicazione/sistema. quello che
dobbiamo fare noi 竪 fornirgli il nome che
le identificher叩. e la modalit叩 di accesso.
 MODE_PRIVATE 竪 quella standard.
SharedPreferences preferences = this.
getSharedPreferences("org.italialinux.
profilemanager", Context.MODE_PRIVATE);
SharedPreferences/4
 Con preferences a questo punto gia
possiamo leggere i dati contenuti al suo
interno. I metodi da usare sono:
public boolean getBoolean (String key, boolean
defValue);
public float getFloat (String key, float defValue);
public int getInt (String key, int defValue);
public long getLong (String key, long defValue);
public String getString (String key, String
defValue);
SharedPreferences/5
 Tutti i metodi hanno una logica simile,
prendono due argomenti:
 key - La chiave con il quale
abbiamo salvato il valore
 defValue - Il valore da tornare nel
caso non si fosse trovata la
propriet叩 key.
SharedPreferences/5
 Se invece vogliamo modificarne il
contenuto, ci serve l'oggetto:
 SharedPreferences.Editor
 Ci basta chiamare il metodo edit di
SharedPreferences:
SharedPreferences.Editor editor =
preferences.edit();
SharedPreferences/6
 Come prima, per inserire dei dati abbiamo
a disposizione i seguenti metodi:
public SharedPreferences.Editor putBoolean (String key,
boolean value)
public SharedPreferences.Editor putString (String key,
String value)
public SharedPreferences.Editor putLong (String key,
long value)
Per salvare basta chiamare:
SharedPreferences/7
 Esercizio:
 Fare una app android che
identifica se 竪 la prima volta che
viene lanciata.
 Suggerimenti:
 Ci basta un booleano
 Per salvare dobbiamo usare
l'editor
SharedPreferences/9
Assets...
 Con gli asset salviamo i dati su
memoria esterna
 Si utilizzano quando la nostra
applicazione deve salvare file che
non devono essere cancellati se
l'applicazione viene rimossa (foto
scattate, video registrati,etc. )
Assets
 Con gli asset salviamo i dati in
maniera grezza.
 Si utilizzano quando vogliamo
utilizzare, che non devono essere
preprocessati dal resource manager,
e devono essere letti cos狸 come
sono.
Assets
 Vanno messi all'interno della cartella
assets.
Assets/2
 La classe che ci permette di gestirli si
chiama: AssetManager.
 Anche questa volta ci basta chiederla
all'Activity:
AssetManager manager = getAssets();
Assets/3
 Per aprire un file possiamo usare il
metodo open("filename"), che ci
torna un InputStream (da gestire com
cone qualsiasi programma java
InputStream ims = assetManager.open("image.
jpg");
 Con list("foldername") otteniamo la
lista dei files contenuti in una cartella
String[] files = assetManager.list("Files");
Assets/4
SQLite...
 Si tratta di un database relazionale
che non necessita di un server
 Tutto risiede all'interno di un file
 L'interrogazione avviene mediante
query sql.
SQLite
 Per utilizzare i servizi del database
possiamo estendere la classe:
SQLiteOpenHelper
SQLite/2
public class DatabaseManager extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "expenses.db" ;
private static final int DATABASE_VERSION = 1;
** Create a helper object for the Events database */
public DatabaseManager (Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE expense (" +
" _id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "dateOfExpense INTEGER, amount REAL, description TEXT NOT NULL);" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
db.execSQL("DROP TABLE IF EXISTS expense");
onCreate(db);
}
}
SQLite/3
 Il metodo onCreate() - Non 竪 quello
dell'activity.
 Serve per le operazioni preliminari di
creazione del database.
 Questa viene chiamata quando il
database non esiste, in occasione
della prima operazione di scrittura.
SQLite/3
 Il metodo onUpgrade() - Serve
quando dobbiamo effettuare
operazioni di aggiornamento del
database
 Viene chiamato quando cambia il
numero definito in:
DATABASE_VERSION
SQLite/4
public Expense[] findAllExpenses() {
SQLiteDatabase db = getReadableDatabase();
String sql = SELECT date_of_expense,amount,description FROM
expenses ORDER BY date_of_expense;
Cursor c = db.rawQuery(sql,null);
Expense [] result=new Expense [c.getCount()];
c.moveToFirst();
while (!c.isAfterLast()) {
Expense expense = new Expense(c.getLong(0),c.getDouble(1),
c.getString(2));
result[c.getPosition()]=expense;
c.moveToNext();
}
c.close();
}
SQLite/5
 Per accedere al database abbiamo
due metodi:
 getReadableDatabase(); Ci da accesso
in sola lettura
 getWritableDatabase(); Ci da accesso
anche in scrittura
 L'oggetto tornato 竪 un
SQLiteDatabase che contiene i
metodi per le query.
SQLite/6
 Le query possiamo eseguirle con il
metodo
Cursor c = rawQuery(query, null);
 Ora i risultati sono contenuti
all'interno dell'oggetto cursor.
  importante la chiamata
c.moveToFirst();
Altrimenti riceverremo una
NullPointerException
SQLite/7
 Dopo di che ci basta un ciclo while
per navigare fra i risultati della query.
SQLite/7

More Related Content

Introduzione alla programmazione Android - Android@tulug lezione 4

  • 1. Android @Tulug Lezione 4 By IvanGualandri Twitter: @Italialinux
  • 2. Agenda Gestione dello storage SharedPreferences Assets SQLite (un occhiata veloce)
  • 3. Riassunto Nelle ultime lezioni abbiamo visto, come aggiungere componenti grafici ad un applicazione, come farli interagire mediante bottoni, come utilizzare alcune funzioni specifiche del telefonino (invio/ricezione sms)
  • 5. Introduzione allo Storage Android mette a disposizione diverse possibilit叩 per salvare informazioni persistenti sul telefonino. Le principali sono: SharedPreferences Assets Memoria interna (dentro res) SQLite
  • 6. Introduzione allo Storage/1 SharedPreferences: non serve per salvare files, ma per salvare informazioni di configurazione dell'applicazione. O comunque dei dati sotto forma primitiva (numeri, stringhe, etc). Esempio? Se l'applicazione 竪 la prima volta che si avvia.
  • 7. Assets: Viene usato quando vogliamo salvare i files da utilizzare in maniera "grezza" dall'applicazione. Quali per esempio: files di testo, caratteri, brani musicali, etc. Se li mettessimo in /res android li proesserebbe mediante il suo resource system. Introduzione allo Storage/2
  • 8. SQLite: Un vero e proprio database relazionale, quindi cosa dire di pi湛? Si usa quando le informazioni si possono rappresentare mediante tabelle, e si vogliono fornire funzioni veloci di interrogazione, ordinamento, etc. Introduzione allo Storage/3
  • 9. Memoria interna: In questo caso si sfrutta la cartella resources, e quindi il dato risiede nella cosiddetta memoria interna. Rende l'accesso dei dati da parte dell'applicazione pi湛 semplice. Il problema 竪 che molti telefonini hanno la memoria interna molto limitata. Introduzione allo Storage/4
  • 11. Questa modalit叩 ci permette di salvare dei tipi di dato primitivo nella modalit叩: chiave - valore Per dati primitivi intendiamo: interi, stringhe, booleani, etc. SharedPreferences
  • 12. Esistono due tipi: SharedPreferences: Sono informazioni disponibili per tutte le componenti dell'applicazione Preferences: Sono invece disponibili solamente dalla singola activity Noi vedremo solo le shared. SharedPreferences/2
  • 13. Ovviamente le due operazioni che possiamo fare sono leggere o scrivere valori. Per la prima basta solo l'accesso all'oggetto SharedPreferences, Per la seconda invece dobbiamo utilizzare: SharedPreferences.Editor SharedPreferences/3
  • 14. Della creazione/accesso all'oggetto se ne occupa l'applicazione/sistema. quello che dobbiamo fare noi 竪 fornirgli il nome che le identificher叩. e la modalit叩 di accesso. MODE_PRIVATE 竪 quella standard. SharedPreferences preferences = this. getSharedPreferences("org.italialinux. profilemanager", Context.MODE_PRIVATE); SharedPreferences/4
  • 15. Con preferences a questo punto gia possiamo leggere i dati contenuti al suo interno. I metodi da usare sono: public boolean getBoolean (String key, boolean defValue); public float getFloat (String key, float defValue); public int getInt (String key, int defValue); public long getLong (String key, long defValue); public String getString (String key, String defValue); SharedPreferences/5
  • 16. Tutti i metodi hanno una logica simile, prendono due argomenti: key - La chiave con il quale abbiamo salvato il valore defValue - Il valore da tornare nel caso non si fosse trovata la propriet叩 key. SharedPreferences/5
  • 17. Se invece vogliamo modificarne il contenuto, ci serve l'oggetto: SharedPreferences.Editor Ci basta chiamare il metodo edit di SharedPreferences: SharedPreferences.Editor editor = preferences.edit(); SharedPreferences/6
  • 18. Come prima, per inserire dei dati abbiamo a disposizione i seguenti metodi: public SharedPreferences.Editor putBoolean (String key, boolean value) public SharedPreferences.Editor putString (String key, String value) public SharedPreferences.Editor putLong (String key, long value) Per salvare basta chiamare: SharedPreferences/7
  • 19. Esercizio: Fare una app android che identifica se 竪 la prima volta che viene lanciata. Suggerimenti: Ci basta un booleano Per salvare dobbiamo usare l'editor SharedPreferences/9
  • 21. Con gli asset salviamo i dati su memoria esterna Si utilizzano quando la nostra applicazione deve salvare file che non devono essere cancellati se l'applicazione viene rimossa (foto scattate, video registrati,etc. ) Assets
  • 22. Con gli asset salviamo i dati in maniera grezza. Si utilizzano quando vogliamo utilizzare, che non devono essere preprocessati dal resource manager, e devono essere letti cos狸 come sono. Assets
  • 23. Vanno messi all'interno della cartella assets. Assets/2
  • 24. La classe che ci permette di gestirli si chiama: AssetManager. Anche questa volta ci basta chiederla all'Activity: AssetManager manager = getAssets(); Assets/3
  • 25. Per aprire un file possiamo usare il metodo open("filename"), che ci torna un InputStream (da gestire com cone qualsiasi programma java InputStream ims = assetManager.open("image. jpg"); Con list("foldername") otteniamo la lista dei files contenuti in una cartella String[] files = assetManager.list("Files"); Assets/4
  • 27. Si tratta di un database relazionale che non necessita di un server Tutto risiede all'interno di un file L'interrogazione avviene mediante query sql. SQLite
  • 28. Per utilizzare i servizi del database possiamo estendere la classe: SQLiteOpenHelper SQLite/2
  • 29. public class DatabaseManager extends SQLiteOpenHelper { private static final String DATABASE_NAME = "expenses.db" ; private static final int DATABASE_VERSION = 1; ** Create a helper object for the Events database */ public DatabaseManager (Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE expense (" + " _id INTEGER PRIMARY KEY AUTOINCREMENT, " + "dateOfExpense INTEGER, amount REAL, description TEXT NOT NULL);" ); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS expense"); onCreate(db); } } SQLite/3
  • 30. Il metodo onCreate() - Non 竪 quello dell'activity. Serve per le operazioni preliminari di creazione del database. Questa viene chiamata quando il database non esiste, in occasione della prima operazione di scrittura. SQLite/3
  • 31. Il metodo onUpgrade() - Serve quando dobbiamo effettuare operazioni di aggiornamento del database Viene chiamato quando cambia il numero definito in: DATABASE_VERSION SQLite/4
  • 32. public Expense[] findAllExpenses() { SQLiteDatabase db = getReadableDatabase(); String sql = SELECT date_of_expense,amount,description FROM expenses ORDER BY date_of_expense; Cursor c = db.rawQuery(sql,null); Expense [] result=new Expense [c.getCount()]; c.moveToFirst(); while (!c.isAfterLast()) { Expense expense = new Expense(c.getLong(0),c.getDouble(1), c.getString(2)); result[c.getPosition()]=expense; c.moveToNext(); } c.close(); } SQLite/5
  • 33. Per accedere al database abbiamo due metodi: getReadableDatabase(); Ci da accesso in sola lettura getWritableDatabase(); Ci da accesso anche in scrittura L'oggetto tornato 竪 un SQLiteDatabase che contiene i metodi per le query. SQLite/6
  • 34. Le query possiamo eseguirle con il metodo Cursor c = rawQuery(query, null); Ora i risultati sono contenuti all'interno dell'oggetto cursor. importante la chiamata c.moveToFirst(); Altrimenti riceverremo una NullPointerException SQLite/7
  • 35. Dopo di che ci basta un ciclo while per navigare fra i risultati della query. SQLite/7