Tutorial Android database: come creare un database Android SQLite e fare operazioni CRUD

Con il codice che vi mostrerò in questo tutorial potrete creare un database SQLite per Android ed implementare le principali funzioni, quelle di CRUD (creazione, lettura, modifica e cancellazione dei dati).

Il codice è ben commentato, pertanto intervallerò solo alcune precisazioni tra un listato e l’altro. Nel caso aveste domande, intervenite tranquillamente nei commenti.

Ho utilizzato Eclipse per implementare il codice e per concentrarmi solo sul database non faccio uso di interfacce grafiche Android; tutti i risultati li stampo a video sul Log Cat (in Eclipse si apre da Windows -> show view -> LogCat).

Vediamo come creare un database per Android e gestire le operazioni CRUD.

Per prima cosa dobbiamo controllare se esiste già un database e verificarne la versione.
Un’ applicazione che viene avviata per la prima volta dovrà creare da zero il proprio database, mentre se ci sono stati degli aggiornamenti, può capitare che all’avvio l’applicazione debba apportare modifiche al database.
Per fare tutto questo ci viene incontro la classe SQLiteOpenHelper, che offre il metodo onCreate per creare il database, e il metodo onUpdate per apportare modifiche al database (vede se il numero di versione del vecchio database è uguale a quello nuovo; se è minore ci sono da fare modifiche).

Per personalizzare meglio il database, ho esteso la classe SQLiteOpenHelper con la mia classe DBHelper, la quale creerà due tabelle: libri e clienti.
Attenzione a far eseguire una query alla volta per creare la struttura del database.

Ecco la classe DBHelper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
	//Nome del database
    public static final String NOME_DB = "biblioteca";
    //Versione del database
    public static final int VERSIONE_DB = 1;
    //Stringa per creare la tabella libri
    private static final String CREATE_TABLE_LIBRI =
        "create table libri (_id integer primary key autoincrement, "
     + Libri.TITOLO+ " TEXT," 
     + Libri.PREZZO+ " INTEGER," 
     + Libri.TRAMA+ " TEXT" + ");";
    //Stringa per creare la tabella clienti
    private static final String CREATE_TABLE_CLIENTI =
        "create table clienti (_id integer primary key autoincrement, "
     + Clienti.NOME+ " TEXT," 
     + Clienti.COGNOME+ " TEXT," 
     + Clienti.INDIRIZZO+ " TEXT" + ");";

    /**
     * Costruttore dell'helper
     * @param context
     */
	public DBHelper(Context context) {
		super(context, NOME_DB, null, VERSIONE_DB);
		// TODO Auto-generated constructor stub
	}
	/**
	 * Metodo usato per creare il DB se non esiste
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		System.err.println("Dentro create tables");
        db.execSQL(CREATE_TABLE_LIBRI);
        db.execSQL(CREATE_TABLE_CLIENTI);
	}
	/**
	 * Metodo usato per fare upgrade del DB se il numero di versione nuovo è maggiore del vecchio
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
    	System.err.println("Dentro update tables");
    	db.execSQL("DROP TABLE IF EXISTS "+ Libri.TABELLA);
    	db.execSQL("DROP TABLE IF EXISTS "+ Clienti.TABELLA);
    	onCreate(db);
	}

}

Implementato il codice che crea il database, vediamo la classe che “mappa” il comportamento e le caratteristiche dei dati che rappresentano i “libri”.
Ho reso tutto static, dato che utilizzo tale classe solo come contenitore di metodi e costanti e non uso il suo costruttore.
Per inserire i dati nel database usiamo la classe ContentValues che permette di associare ad un campo del database il suo valore.
Per prelevare i dati dal database, ci facciamo restituire un oggetto di tipo Cursor. Questo è un cursore che punta ai record prelevati dalla tabella e scorrendolo possiamo lavorare sui dati che ci interessano.

Ecco la classe Libri:

import android.content.ContentValues;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class Libri {
	//I campi della tabella libri
    public static final String ID = "_id";
    public static final String TITOLO = "titolo";
    public static final String PREZZO = "prezzo";
    public static final String TRAMA = "trama";

    public static final String TABELLA = "libri";
    public static final String[] COLONNE = new String[]{ID, TITOLO, PREZZO, TRAMA};

    /**
     * Funzione statica usata per inserire un libro nel DB
     * @param db
     * @param titolo
     * @param prezzo
     * @param trama
     */
    public static void insertLibro(SQLiteDatabase db, String titolo, int prezzo, String trama){
    	ContentValues v = new ContentValues();
    	v.put(TITOLO, titolo);
    	v.put(PREZZO, prezzo);
    	v.put(TRAMA, trama);

    	db.insert(TABELLA, null, v);
    }
    /**
     * Ritorna un cursore che punta a tutti i libri contenuti nel DB
     * @param db
     * @return
     */
    public static Cursor getAllLibri(SQLiteDatabase db){
    	return db.query(TABELLA, COLONNE, null, null, null, null, null);
    }
    /**
     * Cancella il libro che a l'id passato come parametro
     * @param db
     * @param id
     * @return
     */
    public static boolean deleteLibro(SQLiteDatabase db, long id) {
        return db.delete(TABELLA, ID + "=" + id, null) > 0;
    }
    /**
     * Ritorna un cursore che punta al libro che ha l'id passato come parametro
     * @param db
     * @param id
     * @return
     * @throws SQLException
     */
    public static Cursor getLibro(SQLiteDatabase db, long id) throws SQLException {
        Cursor c = db.query(true, TABELLA, COLONNE, ID + "=" + id, null, null, null, null, null);
        if (c != null) {
            c.moveToFirst();
        }
        return c;
    }
    /**
     * Modifica i valori del libro il cui id è uguale a quello passato come parametro
     * @param db
     * @param id
     * @param titolo
     * @param prezzo
     * @param trama
     * @return
     */
    public static boolean updateLibro(SQLiteDatabase db, long id, String titolo, int prezzo, String trama){
        ContentValues v = new ContentValues();
        v.put(TITOLO, titolo);
        v.put(PREZZO, prezzo);
        v.put(TRAMA, trama);

        return db.update(TABELLA, v, ID + "=" + id, null) >0; 
    }

}

Per rappresentare i clienti il listato sarebbe identico a quello dei libri, quindi qui non viene riportato.

Infine ci serve una classe che estenda Activity e che sia il punto di partenza per avviare la nostra applicazione e farle fare ciò che vogliamo.
Per questo di seguito riporto il listato della classe Principale che svolgerà le seguenti operazioni:

  • Con la classe DBHelper crea il database.
  • Con i metodi delle classi Libri e Clienti popola il database con dei dati di prova.
  • Sul Log Cat stampa l’elenco di tutti i libri letti dal database.
  • Sul Log Cat stampa l’elenco di tutti i clienti letti dal database.
  • Cancella il libro con ID 1.
  • Sul Log Cat stampa l’elenco di tutti i libri letti dal database.
  • Modifica il prezzo del libro che ha ID 2 e lo mette a 23.
  • Sul Log Cat stampa l’elenco di tutti i libri letti dal database.

Ecco il codice della classe Principale:

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class Principale extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //creo l'helper per aprire il DB
    	DBHelper databaseHelper = new DBHelper(this);
    	//apro il DB sia in lettura che in scrittura
    	SQLiteDatabase db = databaseHelper.getWritableDatabase();

    	//Popolo il DB con un pò di dati
		Libri.insertLibro(db, "Divina Commedia", 15, "Dante nell'inferno, purgatorio, paradiso");
		Libri.insertLibro(db, "Promessi Sposi", 12, "Storia di un amore");
		Libri.insertLibro(db, "De bello gallico", 5, "La guerra in gallia di Cesare");

		System.err.println("Inseriti 3 libri");

		Clienti.insertCliente(db, "Fabio", "Rossi", "Via Matteotti");
		Clienti.insertCliente(db, "Erica", "Bianchi", "Via Garibaldi");
		Clienti.insertCliente(db, "Matteo", "Neri", "Corso Italia");

		System.err.println("Inseriti 3 clienti");

		//Assegno a un cursore tutti i lirbi trovati nel DB
    	Cursor c = Libri.getAllLibri(db);
    	try
    	{
    		System.err.println("Elenco libri:");
    		stampaAll(c);

    		c = Clienti.getAllClienti(db);
    		System.err.println("Elenco clienti:");
    		stampaAll(c);

    		System.err.println("Cancello libro con id 1");
    		Libri.deleteLibro(db, 1);

    		c = Libri.getAllLibri(db);
    		System.err.println("Elenco libri, deve mancare id 1:");
    		stampaAll(c);

    		System.err.println("Modifico libro con id 2, metto prezzo a 23");
    		Libri.updateLibro(db, 2, "De bello gallico", 23, "La guerra in gallia di Cesare");

    		c = Libri.getAllLibri(db);
    		System.err.println("Elenco libri, il prezzo di id 2 deve essere 23:");
    		stampaAll(c);
    	}
    	finally
    	{
    		//Chiudo il cursore e il db
    		c.close();
    		db.close();
    		System.err.println("Ho chiuso il cursore e il db");
    	}
    }

    /**
     * Prende il cursore passato, lo scorre fino alla fine e a mano a mano stampa i record trovati.
     * @param c
     */
    public void stampaAll(Cursor c){
		while (c.moveToNext())
		{
			System.err.println("informaticoonline.it " + c.getLong(0) + " " + 
				c.getString(1) + " " + c.getString(2) + " " + c.getString(3));
		}
    }
}

I risultati stampati sul Log Cat saranno come quelli evidenziati dal box rosso nella seguente figura:

Log Cat del tutorial database SQLite per Android

Risultati sul Log Cat del tutorial database SQLite per Android

Tagged with  
,

6 thoughts on “Tutorial Android database: come creare un database Android SQLite e fare operazioni CRUD

  1. Che Dio ti benedica! Non so proprio come avrei fatto a realizzare il database per il mio progetto Android senza il tuo tutorial. Grazie 1000, anzi grazie Googol (ovvero 10^100)!

  2. Chi mi sa dire dove viene memorizzato il database in android ?

  3. Ciao grazie per il tutorial, xD solamente adesso ho capito come funzionano =).

    Però adesso avrei un problema, come faccio ad interrogare il database:

    SELECT nomefile,risposta
    FROM Personaggi

    il risultato metterlo in una stringa per poterlo confrontare con i 2 valori che inserisce l’ utente.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="">