Originariamente inviato da
Diegroid
ciao, rispondo rapidamente alla parte sugli statement e transazioni.
una transazione e' un'operazione che ha le proprieta'
ACID.
esempio di transazione, dal
bulkInsert() di un mio Content Provider, che come vedi manca degli statements:
codice:
try {
// TODO: add compiled statement if possible
db.beginTransaction();
for(ContentValues rowVals : values) {
if (rowVals == null) throw new IllegalArgumentException("values of a bulk can't be null");
checkRequiredValues(rowVals);
populateDefaultValues(rowVals);
db.insert(TABLE_SCHEMES, null, rowVals);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
db e' un database ottenuto con
getWritableDatabase(). nota che manca il
catch() perche' non mi interessava catturare le eccezioni, solo eseguire il
finally. ma se volessi fare un rollback della transazione, dovresti farlo dentro il catch.
all'interno di quella transazione uno potrebbe usare un compiled statement, che e' uno statement "generico" che viene inviato al server sql, il quale lo mette in cache, e per eseguirlo devi solo passare i parametri particolari. un esempio e' il seguente:
codice:
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("INSERT INTO Tabella (UserId, AttributeKey, AttributeValue) VALUES (?,?,?)");
// lego i valori ai punti di domanda, secondo l'ordine giusto
stmt.bindLong(1, userId);
stmt.bindString(2, key);
stmt.bindString(3, value);
stmt.executeInsert();
la parte in cui fai i binding e chiami
execute() potrebbe essere all'interno di un ciclo, in modo da prendere i valori da una qualche lista.
nota pure che gli statement sono particolarmente utili per
insert e
update, per una
select non mi viene in mente un caso utile (tra l'altro uno statement puo' ritornare un solo valore).
a proposito di
select: con ottimizzarle intendevo solo che se devi prendere varie righe di una tabella, non le prendi una per una ma tutte insieme con un opportuna
where.