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

Introduzione alla programmazione Android - Android@tulug lezione 4

  • 1.
    Android @Tulug Lezione 4 ByIvanGualandri Twitter: @Italialinux
  • 2.
    Agenda ● Gestione dellostorage ● SharedPreferences ● Assets ● SQLite (un occhiata veloce)
  • 3.
    Riassunto ● Nelle ultimelezioni abbiamo visto, come aggiungere componenti grafici ad un applicazione, come farli interagire mediante bottoni, come utilizzare alcune funzioni specifiche del telefonino (invio/ricezione sms)
  • 4.
  • 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: Vieneusato 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: Unvero 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
  • 10.
  • 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 duetipi: ○ 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 ledue 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/accessoall'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 preferencesa 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 imetodi 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 invecevogliamo 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: ○ Fareuna app android che identifica se è la prima volta che viene lanciata. ● Suggerimenti: ○ Ci basta un booleano ○ Per salvare dobbiamo usare l'editor SharedPreferences/9
  • 20.
  • 21.
    ● Con gliasset 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 gliasset 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 messiall'interno della cartella assets. Assets/2
  • 24.
    ● La classeche ci permette di gestirli si chiama: AssetManager. ● Anche questa volta ci basta chiederla all'Activity: AssetManager manager = getAssets(); Assets/3
  • 25.
    ● Per aprireun 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
  • 26.
  • 27.
    ● Si trattadi 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 utilizzarei servizi del database possiamo estendere la classe: SQLiteOpenHelper SQLite/2
  • 29.
    public class DatabaseManagerextends 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 metodoonCreate() - 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 metodoonUpgrade() - 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 accedereal 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 querypossiamo 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 diche ci basta un ciclo while per navigare fra i risultati della query. SQLite/7