back to top

Generazione ed utilizzo di database SQL Lite in Android Studio

Le tecniche di archiviazione viste fino a questo momento sono consigliabili per la gestione di piccole quantità di dati. Se invece per esempio volessimo archiviare e gestire gli indirizzi di tutti i clienti di un’azienda l’approccio migliore sarebbe quello di utilizzare un database. Questo perché con questo tipo di approccio è molto più semplice poi ricercare dati specifici, semplicemente effettuando una interrogazione ed inoltre l’utilizzo di un database ci consente di assicurare l’integrità dei dati, specificando le relative relazioni.

Da questo punto di vista Android utilizza il sistema di database SQLite e una struttura in cui un database è accessibile solo dall’applicazione che lo genera e non dalle altre. Un approccio consigliato per la gestione di database è quello di creare una classe di servizio che contenga tutto il codice necessario per la gestione dei dati, in modo che tale gestione sia trasparente all’interno del codice della nostra applicazione.

Quindi avviamo Android Studio, creiamo un nuovo progetto denominato TestDatabase e aggiungiamo al package un nuovo file denominato GestioneDB.java. Si tratta del file in cui andremo a definire il codice di gestione del database

Nel nostro esempio definiremo un database denominato TestDB e contenente una sola tabella denominata Clienti, avente tre colonne: id, nome e indirizzo. Andiamo dunque a modificare il file GestioneDB.java nel modo seguente

package com.example.test.testdatabase;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class GestioneDB {

    static final String KEY_RIGAID = "id";
    static final String KEY_NOME = "nome";
    static final String KEY_INDIRIZZO = "indirizzo";
    static final String TAG = "GestioneDB";
    static final String DATABASE_NOME = "TestDB";
    static final String DATABASE_TABELLA = "clienti";
    static final int DATABASE_VERSIONE = 1;

    static final String DATABASE_CREAZIONE =
            "CREATE TABLE clienti (id integer primary key autoincrement, "
                    + "nome text not null, indirizzo text not null);";

    final Context context;
    DatabaseHelper DBHelper;
    SQLiteDatabase db;

    public GestioneDB(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, DATABASE_NOME, null, DATABASE_VERSIONE);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            try {
                db.execSQL(DATABASE_CREAZIONE);
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
            Log.w(DatabaseHelper.class.getName(),"Aggiornamento database dalla versione " + oldVersion + " alla "
            + newVersion + ". I dati esistenti verranno eliminati.");
            db.execSQL("DROP TABLE IF EXISTS clienti");
            onCreate(db);
        }

    }


    public GestioneDB open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }


    public void close()
    {
        DBHelper.close();
    }


    public long inserisciCliente(String nome, String indirizzo)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_NOME, nome);
        initialValues.put(KEY_INDIRIZZO, indirizzo);
        return db.insert(DATABASE_TABELLA, null, initialValues);
    }


    public boolean cancellaCliente(long rigaId)
    {
        return db.delete(DATABASE_TABELLA, KEY_RIGAID + "=" + rigaId, null) > 0;
    }


    public Cursor ottieniTuttiClienti()
    {
        return db.query(DATABASE_TABELLA, new String[] {KEY_RIGAID, KEY_NOME, KEY_INDIRIZZO}, null, null, null, null, null);
    }


    public Cursor ottieniCliente(long rigaId) throws SQLException
    {
        Cursor mCursore = db.query(true, DATABASE_TABELLA, new String[] {KEY_RIGAID, KEY_NOME, KEY_INDIRIZZO}, KEY_RIGAID + "=" + rigaId, null, null, null, null, null);
        if (mCursore != null) {
            mCursore.moveToFirst();
        }
        return mCursore;
    }


    public boolean aggiornaCliente(long rigaId, String name, String email)
    {
        ContentValues args = new ContentValues();
        args.put(KEY_NOME, name);
        args.put(KEY_INDIRIZZO, email);
        return db.update(DATABASE_TABELLA, args, KEY_RIGAID + "=" + rigaId, null) > 0;
    }

}

Andiamo ad analizzare questo codice. Nella prima parte abbiamo definito alcune costanti relative ai campi della tabella che andremo a gestire ed al relativo database. In particolare la costante DATABASE_CREAZIONE contiene l’istruzione SQL per la creazione della tabella clienti all’interno del database TestDB.

All’interno della classe GestioneDB abbiamo poi creato una classe privata (DatabaseHelper) che estende la classe SQLiteOpenHelper, cioè la classe che in Android consente di gestire la creazione di database e di gestire altri aspetti, come la versione dello stesso. All’interno di questa classe abbiamo effettuato l’override del metodo onCreate, che permette di generare un nuovo database e l’override del metodo onUpgrade, che consente di aggiornare la versione del database. Successivamente abbiamo implementato tutti i metodi canonici per l’apertura e chiusura del database e per l’inserimento, modifica e cancellazione delle righe della tabella clienti.

Per creare un database all’interno dell’applicazione utilizzando la classe GestioneDB occorre creare un’istanza della classe

public GestioneDB(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

Nel costruttore della classe GestioneDB viene istanziato un oggetto DatabaseHelper per la creazione di un nuovo database, cosa che avviene nel costruttore della classe

DatabaseHelper(Context context)
{
    super(context, DATABASE_NOME, null, DATABASE_VERSIONE);
}

A questo punto vediamo come effettuare le operazioni di creazione, lettura, inserimento e modifica dei dati di un database e per farlo modifichiamo il file MainActivity.java dell’applicazione nel modo seguente

package com.example.test.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);

        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();
    }
}

Nel codice di esempio appena visto 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 Android Device Monitor il relativo file system, vedremo che viene creato il database TestDB all’interno della cartella databases

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.test.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 in cui vengono inseriti i clienti, ho aggiunto il codice per recuperare i dati dal database e visualizzarli in un messaggio tramite il metodo Toast. 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 e per visualizzare tutti i dati è necessario prima chiamare il metodo moveToFirst per posizionarsi sul primo record e quindi utilizzare il metodo moveToNext per scorrere gli altri record.

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)
Pubblicitร