[DEV] Creare un database su Android con sqlite

[DEV] Creare un database su Android con sqlite

Affrontando lo sviluppo delle vostre prime applicazioni vi accorgerete sicuramente che uno dei concetti fondamentali che bisogna possedere è il come e dove salvare i dati utili alla nostra applicazione. L’sdk di Android ci fornisce diversi strumenti come le shared preferences, i content values o il database classico.

Vediamo come primo strumento come creare e gestire un database SQLite.

Potremo usare questa classe nella nostra activity.


public class MyDatabase {

SQLiteDatabase mDb;

DbHelper mDbHelper;

Context mContext;

private static final String DB_NAME="exampleDb";//nome del database<!--more-->

private static final int DB_VERSION=1; //numero di versione del nostro database

public MyDatabase(Context ctx){

mContext=ctx;

mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);

}

public void open(){  //apriamo il database, rendendolo scrivibile e leggibile

mDb=mDbHelper.getWritableDatabase();

}

public void close(){ //chiudiamo il database

mDb.close();

}

// Vediamo ora come aggiungere tabelle e campi alle tabelle del db

public void insertPerson(String name,int eta){ //metodo per inserire i dati

ContentValues cv=new ContentValues();

cv.put(PersonMetaData.PERSON_NAME_KEY, name);

cv.put(PersonMetaData.PERSON_AGE_KEY, eta);

mDb.insert(PersonMetaData.PERSON_TABLE, null, cv);

}

public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati

return mDb.query(PersonMetaData.PERSON_TABLE, null,null,null,null,null,null);

}

static class PersonMetaData {  // i metadati della tabella, accessibili ovunque

static final String PERSON_TABLE = "person";

static final String ID = "_id";

static final String PERSON_NAME_KEY = "name";

static final String PERSON_AGE_KEY = "eta";

}

private static final String PERSON_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella

+ PersonMetaData.PERSON_TABLE + " ("

+ PersonMetaData.ID+ " integer primary key autoincrement, "

+ PersonMetaData.PERSON_NAME_KEY + " text not null, "

+ PersonMetaData.PERSON_AGE_KEY + " integer not null);";

private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

public DbHelper(Context context, String name, CursorFactory factory,int version) {

super(context, name, factory, version);

}

@Override

public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella

_db.execSQL(PERSON_TABLE_CREATE);

}

@Override

public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {

//qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

}

}

}

Creato il database vediamo come implementarlo all’interno di un’activity richiamando gli elementi del db e mostrandoli in una ListView:

public class Example extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView personTv=(TextView)findViewById(R.id.personTv);

ListView peopleLv=(ListView)findViewById(R.id.peopleLv);

MyDatabase db=new MyDatabase(getApplicationContext());

db.open();  //apriamo il db

if(db.fetchProducts().getCount()==0){//query di tutti i dati e inserimento dati, solo se il db è vuoto

db.insertProduct("Fabrizio", 23);

db.insertProduct("Giorgio", 61);

db.insertProduct("Rino", 87);

}

Cursor c=db.fetchProducts(); // Creiamo un cursore con tutti i dati del db

startManagingCursor(c);

SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor

this,

R.layout.person, //il layout di ogni riga/prodotto

c,

new String[]{MyDatabase.PersonMetaData.PERSON_NAME_KEY,MyDatabase.PersonMetaData.PERSON_AGE_KEY},//queste colonne

new int[]{R.id.nameTv,R.id.ageTv});//in queste textView

peopleLv.setAdapter(adapter); //L'adapter per la lista

//qui vediamo invece come prendere i dati dal db e visualizzarli nelle textview

int nameCol=c.getColumnIndex(MyDatabase.PersonMetaData.PERSON_NAME_KEY);  //indici delle colonne

int ageCol=c.getColumnIndex(MyDatabase.PersonMetaData.PERSON_AGE_KEY);

if(c.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto

do {

personTv.append("Person Name:"+c.getString(nameCol)+", Età:"+c.getInt(ageCol)+"\n"); //estrazione dei dati dalla entry del cursor

} while (c.moveToNext());//iteriamo al prossimo elemento

}

db.close();

}

}

Vediamo ora i due file xml correlati, molto semplici:
prima il main

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/personTv"

android:textColor="#000000"

android:textSize="20dp" />

<ListView

android:id="@+id/peopleLv"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:cacheColorHint="#00000000"

android:dividerHeight="2dp"

></ListView>

</LinearLayout>

Poi abbiamo il layout di ogni singolo elemento della lista:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal"

android:weightSum="10"

>

<TextView

android:id="@+id/nameTv"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="8"

android:textSize="15dp"

android:textStyle="bold"

android:textColor="#000000">

</TextView>

<TextView

android:id="@+id/ageTv"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="2"

android:textSize="15dp"

android:textStyle="bold"

android:textColor="#000000">

</TextView>

</LinearLayout>

[Via]

Tags: , , ,

6 Commenti

  1. baloonaloon

    ma un profano che vuole capire cio che avete scritto come deve fare? Esiste 1 giuda?

    • buonsala

      puoi comprarti una guida utilissima:
      Android. Guida per lo sviluppatore di Massimo Carli…..

      pero’ devi masticare… un po di java e informatica…
      Non e’ semplice!

      • MCSOLOPANINI

        Io ho tutti e 2 i libri di massimo ……..NON COMPRATELI CERCATEVI TUTTO SUL WEB! SONO UNA PORCHERIA!

  2. Marcos

    sulla riga

    mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);

    il valore null va in errore.. con che cosa la devo sostituire?

  3. Ciao! Ottima guida. Se non sbaglio però c’è qualcosa che non torna.

    Dentro l’activity le righe del tipo:

    db.insertProduct(“Fabrizio”, 23);

    credo vadano sostituite con righe del tipo

    db.insertPerson(“Fabrizio”, 23);

    dove insertPerson è il metodo definito nella classe MyDatabase per inserire dati nella tabella denominata person (product non esiste.. sarà un refuso). ;-)

  4. Donatella

    Bravo, essenziale ed esaustivo: parla il codice. Così deve essere un esempio!

Trackbacks/Pingbacks

  1. Tweets that mention [DEV] Creare un database su Android con sqlite | Nexus Lab - Sperimentazioni androidi - News, prove, tutorial e programmazione su android -- Topsy.com - [...] This post was mentioned on Twitter by Appunti Sul Web, Nexus-Lab. Nexus-Lab said: : [DEV] Creare un database su ...
  2. Post sul blog e citazione delle fonti - [...] sul blog e citazione delle fonti Buongiorno, vorrei ...

Commenta!