Vediamo ora come operare sui dati effettuando le consuete operazioni di inserimento, lettura e modifica. Per farlo modifichiamo il file MainActivity.java di una nostra ipotetica applicazione nel modo seguente:
package com.example.testdatabase;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// creo un'istanza della classe GestioneDB
GestioneDB db = new GestioneDB(this);
db.open();
long id = db.inserisciCliente("Mario Rossi", "Via girasole, 10");
id = db.inserisciCliente("Giuseppe Verdi", "Corso Italia, 35");
db.close();
}
}
In questo esempio creiamo un’istanza della classe GestioneDB e attraverso il metodo inserisciCliente andiamo ad inserire due clienti nella tabella clienti. Se avviamo l’applicazione sull’emulatore e successivamente andiamo a visualizzare nella vista DDMS il relativo file system, vedremo che viene creato il database TestDB all’interno della cartella databases. Come abbiamo detto, infatti, al primo avvio dell’applicazione viene creato il relativo database.
Adesso vediamo come recuperare i dati dei clienti dal nostro database. Per farlo useremo il metodo ottieniTuttiClienti della classe GestioneDB. Andiamo dunque a modificare il file MainActivity.java nel modo seguente:
package com.example.testdatabase;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GestioneDB db = new GestioneDB(this);
/*
db.open();
long id = db.inserisciCliente("Mario Rossi", "Via girasole");
id = db.inserisciCliente("Giuseppe Verdi", "Corso Italia, 35");
db.close();
*/
db.open();
Cursor c = db.ottieniTuttiClienti();
if (c.moveToFirst())
{
do {
Toast.makeText(this,
"id: " + c.getString(0) + "n" +
"Nome: " + c.getString(1) + "n" +
"Indirizzo: " + c.getString(2),
Toast.LENGTH_LONG).show();
} while (c.moveToNext());
}
db.close();
}
}
Vi faccio notare che ho commentato la parte (che ho utilizzato nell’esempio precedente) in cui vengono inseriti i clienti ed ho aggiunto il codice per recuperare i dati dal database e visualizzarli in un messaggio. Avviando adesso l’applicazione il risultato sarà quello di visualizzare i nomi dei due contatti inseriti in precedenza.
Il metodo ottieniTuttiClienti della classe GestioneDB permette di ottenere tutti i record presenti nella tabella. Il risultato viene assegnato ad un oggetto Cursor (qualcosa di simile a quello che, in altri linguaggi, è chiamato RecordSet) e per visualizzare tutti i dati è necessario prima chiamare il metodo moveToFirst() per spostare il Cursor sul primo record e quindi utilizzare il metodo moveToNext() per scorrere gli altri record.
Una volta posizionati sul record desiderato è possibile estrarne il valore utilizzando il riferimento al cursore associato al metodo specifico per il tipo di dato che ci si attende (ad esempio getString se si tratta di una stringa di testo).
Per recuperare i dati di un record solo basta modificare il codice precedente chiamando il metodo ottieniCliente al posto di ottieniTuttiClienti. Il metodo ottieniCliente richiede come parametro l’id del record da recuperare.
Cursor c = db.ottieniCliente(1);
Anche per aggiornare un singolo cliente occorre passare come primo parametro il relativo id al metodo aggiornaCliente, insieme ai nuovi valori di nome e indirizzo:
db.aggiornaCliente(1,"Mario Giulio Rossi", "Via nuova, 10");
Mentre per cancellare un cliente basta passare l’id al metodo cancellaCliente
db.cancellaCliente(1)
Modificare la struttura del database (versioning)
Un aspetto su cui vorrei soffermarmi è quello relativo al fatto che spesso dopo aver creato un database è necessario aggiungere altre tabelle, cambiare lo schema del database o aggiungere colonne alle tabelle esistenti. Purtroppo le possibilità di manipolazione offerte da SQLite sono limitate in tal senso e pertanto, per apportare modifiche sostanziose al DB, è necessario crearne uno nuovo.
Per effettuare questa operazione occorre cambiare la costante relativa alla versione del database, assegnandole un valore maggiore di quello del database precedente. Nel nostro caso assegniamo il valore 2 alla costante DATABASE_VERSIONE:
static final int DATABASE_VERSIONE = 2;
Contestualmente, ovviamente, dovremo aggiornare la stringa contenente la query che crea le tabelle applicando le modifiche desiderate.
Mediante questa procedura, al prossimo riavvio dell’applicazione, il sistema – verificato che la versione del DB è cambiata – provvederà a cancellare il vecchio database ed a crearne uno nuovo in sua sostituzione. Tale procedimento, tuttavia, ha un effetto tutt’altro che secondario. Nel momento in cui andremo ad eseguire l’applicazione, infatti, vedremo un messaggio simile al seguente nella finestra LogCat di Eclipse:
GestioneDB(8705): Upgrading database from version 1 to 2,
which will destroy all old data
Se abbiamo interesse ai dati presenti nel nostro vecchio DB, quindi, dobbiamo prevedere una soluzione di backup riversando, ad esempio, i dati all’interno di una tabella temporanea e, successivamente, ricopiarli all’interno del database ricreato.