Android List View - Corso di Programmazione Mobile

annuncio pubblicitario
SQLite
Introduzione a SQLite
Oltre alla possibilità di memorizzare informazioni persistenti attraverso Preferences e files, Android
mette a disposizione un vero e proprio DBMS relazionale: SQLite.
SQLite è un database engine transazionale estremamente flessibile e veloce, che occupa una
quantità molto ridotta di spazio su disco: tutte queste caratteristiche lo rendono perfetto per essere
utilizzato in un contesto di tipo mobile.
Al contrario della maggior parte dei DBMS, non possiede un processo server separato, ma legge e
scrive le informazioni direttamente su file. Difatti un database SQLite non è altro che un file,
pertanto può essere copiato o spostato in un altro sistema ed il tutto continuerà a funzionare
regolarmente.
Per permetterci di gestire al meglio i nostri db, Android ci mette a disposizione una serie di API
apposite.
SQLiteOpenHelper
Una delle classi principali messe a nostra disposizione dalla piattaforma è SQLiteOpenHelper.
Estendendo tale classe, è possibile ridefinire i metodi che ci consentono di effettuare le principali
operazioni per la gestione del db (creazione e aggiornamento). Tali metodi sono:
SQLiteDatabase
La classe SQLiteDatabase rappresenta un’astrazione del db, e fornisce i metodi necessari ad
effettuare le principali operazioni di gestione di un database. Generalmente, per ottenere un’istanza
di tale classe, si fa riferimento a due metodi esposti dall’helper visto nella precedente slide:
getReadableDatabase() e getWritableDatabase(). Tali metodi restituiscono un’istanza di tipo
SQLiteDatabase, che consente l’accesso rispettivamente in lettura ed in scrittura al db.
Nelle successive slide esamineremo i principali metodi esposti da tale classe.
ExecSQL
Tale metodo consente l’esecuzione di qualsiasi comando SQL che non sia di tipo query (quindi che
non preveda la restituzione di informazioni da parte del db). Prevede due overload; il primo richiede
semplicemente il codice SQL da eseguire, mentre il secondo ci fornisce di passare dei parametri per
l’esecuzione dei cosiddetti prepared statements.
• public void delete(String sql);
• public void delete(String sql, Object[] bindArgs);
Operazioni comuni
Nonostante sia possibile effettuare molte operazioni utilizzando il comando ExecSQL appena
descritto, la piattaforma ci offre supporto nativo per le più comuni operazioni che possono essere
effettuate sulle varie tabelle.
Fra questi:
• Delete per eliminare delle righe dalla tabella
• Insert per aggiungere delle nuove righe alla tabella
• Update per aggiornare le informazioni di una riga
• Query per eseguire una query generica sul db
Delete
L’operazione che ci consente di eliminare uno o più record da una specifica tabella
• public int delete(String table, String whereClause, String[] whereArgs);
Il primo parametro rappresenta il nome della tabella interessata, il secondo la stringa contenente la
condizione, mentre l’ultimo gli eventuali parametri per effettuare il bind con la condizione
specificata. Il valore di ritorno indica invece il numero di record eliminati (o -1 in caso di errore).
Insert
Operazione che ci consente di inserire un nuovo record.
• public long insert(String table, String nullColumnHack, ContentValues values);
Il parametro nullColumnHack rappresenta una colonna il cui valore può essere NULL. Tale colonna
sarà utilizzata nel caso in cui volessimo inserire un record con tutti valori NULL oppure di default.
L’istruzione “INSERT INTO NomeTabella;” non è ammessa in SQLite, l’unica alternativa è quella di
utilizzare la seguente sintassi: “INSERT INTO NomeTabella(nullColumn) VALUES(NULL);”
Il parametro ContentValues rappresenta semplicemente una sorta di Map che ci consente di
inserire coppie chiave/valore.
Il valore di ritorno contiene l’id del record appena inserito.
Query
Si differenzia dalle operazioni precedenti in quanto permette di estrarre informazioni dal database.
public Cursor query(boolean distinct, String table, String[] columns, String selection, String[]
selectionArgs, String groupBy, String having, String orderBy, String limit);
•
•
•
•
•
•
Distinct ci consente di indicare se vogliamo effettuare una SELECT oppure una SELECT DISTINCT.
Table nome delle tabella
Columns nomi delle colonne che vorremo selezionare.
Selection condizioni per la select (WHERE.. AND..)
SelectionArgs array di parametri per il bind.
I nomi dei rimanenti parametri rendono semplice comprendere il loro scopo ai fini della query. Il
valore di ritorno è un cursore che ci consentirà di ottenere i vari valori delle singole colonne.
Cursor
Il valore di ritorno dell’operazione di query è di tipo Cursor.
Un’istanza di tale classe rappresenta un cursore, cioè un oggetto in grado di iterare fra i vari record
appartenenti al set di risultati restituito. Essa pertanto avrà un puntatore che farà riferimento al
record corrente ed una serie di metodi che consentiranno di spostarlo e di ottenere la sua posizione
attuale.
Tra i più utilizzati:
• public int getPosition(), restituisce la posizione corrente.
• public boolean move(int offset), moveToNext(), moveToLast(), moveToFirst(), moveToPrevious,
moveToPosition(int position), sono tutti metodi che consentono di spostare il cursore. Il valore di
ritorno indica l’eventuale disponibilità di nuove informazioni.
• public boolean isFirst(), isLast() indica se la posizione del cursore è sul primo valore oppure
sull’ultimo
Cursor
I metodi principali sono quelli che consentono di accedere ai dati:
• public int getInt(int columnIndex);
• public double getDouble(int columnIndex);
• public String getString(int columnIndex);
• public byte[] getBlob(int columnIndex);
Un metodo di utilità che restituisce l’indice della colonna di nome specificato:
• public int getColumnIndex(String columnName)
Cursor e query
Scarica