Sistemi Mobili e Wireless Android - Dati persistenti: SQLite Stefano Burigat Dipartimento di Matematica e Informatica Università di Udine www.dimi.uniud.it/burigat stefano.burigat@uniud.it
Android offre una completa libreria per la creazione e gestione di database SQLite Qualsiasi database SQLite venga creato all'interno di un'applicazione non è direttamente accessibile da altre applicazioni Il modo consigliato di lavorare con un database è creare una classe wrapper che ingloba le variabili ed i metodi che permettono creazione, accesso e gestione del database All'interno della classe wrapper si dovrebbe inoltre creare una sottoclasse di SQLiteOpenHelper per gestire le operazioni di creazione, apertura e aggiornamento del database 2
classe wrapper riferimenti al database SQL ed alla classe helper costanti che specificano il nome delle colonne delle tabelle contenute nel database (in questo caso una sola tabella chiamata contact) NOTA: tutto il codice delle slide seguenti fa parte di questa classe 3
classe helper interna alla classe wrapper l'istruzione SQL usata per la creazione del database i metodi oncreate e onupgrade vengono chiamati in automatico in fase di creazione del database 4
Per ottenere un riferimento ad un database (e poter svolgere operazioni su di esso come inserire o estrarre informazioni) è necessario chiamare il metodo getwritabledatabase (o il metodo getreadabledatabase) dell'oggetto helper metodi pubblici che incapsulano il codice necessario ad aprire e chiudere un database (è buona norma chiudere il db quando non serve più) questo metodo chiama in automatico il metodo appropriato (oncreate o onupdate) della classe helper 5
Per inserire un nuovo record (una riga) in un database abbiamo bisogno di creare un oggetto di tipo ContentValues che incapsula i valori relativi alle diverse colonne metodo ausiliario che usiamo per incapsulare i valori di un nuovo record all'interno di un oggetto di tipo ContentValues 6
La creazione di un nuovo record nel database richiede una chiamata al metodo insertorthrow, passando i dati come oggetto ContentValues il secondo parametro stabilisce il comportamento della insert nel caso in cui initialvalues non specifichi tutti gli elementi: se non impostato a null, il parametro indica in quali colonne vogliamo che sia inserito un null il metodo insertorthrow() restituisce l id (generato automaticamente) del record appena creato o il valore -1 in caso di errore 7
L'aggiornamento di un record nel database richiede una chiamata al metodo update, passando i dati aggiornati e specificando il record da aggiornare il terzo parametro determina quale record vogliamo aggiornare (in questo caso specifichiamo dall'esterno l'id del record); il metodo update() restituisce il numero di record aggiornati 8
L'eliminazione di un record dal database richiede una chiamata al metodo delete, specificando il record da eliminare il secondo parametro determina quale record vogliamo aggiornare (in questo caso specifichiamo dall'esterno l'id del record); il metodo delete() restituisce il numero di record cancellati 9
L'estrazione di record dal database richiede una chiamata al metodo query, specificando quali record vogliamo Il metodo query ritorna un oggetto di tipo Cursor che è in pratica un puntatore alla lista dei risultati L'esempio seguente estrae tutti i record dal database i parametri dal secondo in poi determinano quali record vogliamo estrarre (si veda slide successiva), in questo caso tutti visto che il terzo parametro non è stato specificato 10
Android mette a disposizione 3 metodi query, che accettano un numero differente di parametri in base al tipo di query di cui abbiamo bisogno La versione più comune è quella da 7 parametri il nome della tabella in cui deve essere eseguita la query la lista delle colonne da restituire un filtro per stabilire quali righe restituire (corrisponde alla clausola SQL WHERE) un array di stringhe per inserire dinamicamente alcuni valori nella SELECT un filtro che corrisponde alla clausola SQL GROUP BY un filtro che corrisponde alla clausola HAVING un filtro che corrisponde alla clausola ORDER BY 11
Nell'esempio seguente specifichiamo l'id del record che vogliamo estrarre Nell'esempio seguente specifichiamo il KEY_NAME del record che vogliamo estrarre 12
L'esempio seguente mostra un'activity che accede al database, inserisce valori e li stampa su log 13
ricordarsi di liberare le risorse quando non servono più questo ciclo consente di passare attraverso tutti i record ritornati dal metodo fetchallcontacts() 14
database_activity.xml 15