Corso Base
Lezione 6
Maurizio Cozzetto, Francesco Sarasini
Database SQLite (1/2)
“Android provides full support for SQLite
databases.
databases Any databases you create will
be accessible by name to any class in the
application, but not outside the
application.”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Database SQLite (2/2)
Bisogna estendere la classe SQLiteOpenHelper e
sovrascrivere i metodi onCreate()
onCreate e onUpgrade()
onUpgrade
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (1/4)
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
...
public class MioDatabaseHelper extends SQLiteOpenHelper{
final static String DB_NAME = "nome_db";
final static int DB_VERSION = 1;
public MioDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
...
// continua
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (2/4)
...
@Override
public void onCreate(SQLiteDatabase db) {
// creazione delle tabelle
}
@Override
public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {
// aggiornamento delle tabelle
}
} // fine classe MioDatabaseHelper
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (3/4)
// per creare le tabelle si usa execSQL()
String sql = "";
sql =
// id
sql =
sql =
sql =
sql =
sql =
"CREATE TABLE rubrica(";
è incrementato automaticamente
sql + "id INTEGER PRIMARY KEY,";
sql + "nome TEXT NOT NULL,";
sql + "cognome TEXT NOT NULL,";
sql + "telefono TEXT NOT NULL";
sql + ")";
db.execSQL(sql);
// da inserire in onCreate()
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (4/4)
public class MiaActivity extends Activity {
MioDatabaseHelper mioDatabaseHelper;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mioDataBaseHelper = new MioDatabaseHelper(this);
}
...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Apertura del database
// da qualche parte nell'Activity
SQLiteDatabase db =
mioDatabaseHelper.getWriteableDatabase();
// oppure
Apertura in lettura
e scrittura
SQLiteDatabase db =
mioDatabaseHelper.getReadableDatabase();
Apertura in sola
lettura
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Inserimento di un contatto (1/2)
// apertura in scrittura
SQLiteDatabase db =
mioDatabaseHelper.getWriteableDatabase();
// mappa dei valori da inserire
ContentValues values = new ContentValues();
values.put("nome", "Maurizio");
values.put("cognome", "Cozzetto");
values.put("telefono", "123-123456789");
// continua ...
Caricamento del
record nella mappa
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Inserimento di un contatto (2/2)
// il metodo ritorna l'id del record appena creato
// oppure -1 se non è possibile creare il record
long id = db.insert("rubrica", null, values);
if (id == -1) {
// errore!
db.close();
return;
}
Scrittura del
record
// chiusura del database
db.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Aggiornamento di un contatto
(1/2)
// apertura in scrittura
SQLiteDatabase db =
mioDatabaseHelper.getWriteableDatabase();
// mappa dei valori da inserire
ContentValues values = new ContentValues();
// informazione da aggiornare
values.put("telefono", "456-789012345");
// continua...
Caricamento dei nuovi
dati nella mappa
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Aggiornamento di un contatto
(2/2)
// clausola where
String whereClause = "nome = 'Mario' AND cognome =
'Rossi'";
// r è il numero di record aggiornati
int r = db.update("rubrica",values,whereClause,null);
if (r==0) {
// errore!
Registrazione dei nuovi
db.close();
dati
return;
}
// chiusura del database
db.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Cancellazione di un contatto (1/2)
// apertura in scrittura
SQLiteDatabase db =
mioDatabaseHelper.getWriteableDatabase();
// clausola where
whereClause = "id = ?";
// valore di id
String[] whereArgs = {"1"};
// continua...
Eventuali filtri
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Cancellazione di un contatto (2/2)
// cancellazione
// r restituisce il numero di record cancellati
int r = db.delete("rubrica", whereclause, whereArgs);
if (r==0) {
// errore!
db.close();
return;
}
Cancellazione
del record
// chiusura del database
db.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query (1/2)
// Esecuzione di query SQL
SQLiteDatabase db =
mioDatabaseHelper.getReadableDatabase();
String[] columns = {"id"};
String selection = "cognome = ?";
String selectionArgs = {"Rossi"};
String orderBy = "id ASC";
L'esecuzione di una
query restituisce un
cursore
Cursor cursor = db.query("rubrica",columns, selection,
selectionArgs,null, null, orderBy);
// continua...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query (2/2)
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String nome = cursor.getString(1);
String cognome = cursor.getString(2);
String telefono = cursor.getString(3);
// fai qualcosa con i campi
}
db.close();
Scorriamo il risultato
della query mediante
Il cursore
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (1/7)
“Content providers store and retrieve data
and make it accessible to all applications.
They're the only way to share data across
applications; there's no common storage
area that all Android packages can access.
...
Android exposes several native databases
using Content Providers.”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (2/7)
Ogni tipo di contenuto è esposto mediante un
URI della forma
A. Prefisso standard che indica che il dato è controllato da un
Content Provider
B. La “Authority Part” cioè il Content Provider stesso
C. Il percorso che il Content Provider usa per determinare quale
tipo di dato è richiesto
D. L'id del record specifico richiesto
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (3/7)
“You do not need to write the URIs of the
content providers manually as they are
stored as constant values in their respective
content provider classes.”
Uri dei contatti
content://com.android.contacts/contacts
android.provider.ContactsContract.Contacts
Package
Contacts.CONTENT_URI
Costante che restituisce
la Uri dei contatti
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (4/7)
Android dispone di diversi Content Provider
built-in,
built-in quali le immagini,
immagini i contatti della
rubrica, i bookmark del browser, le chiamate
ricevute, i file multimediali e le impostazioni
del device.
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (5/7)
Browser
Use the browser Content Provider to read or modify
bookmarks, browser history, or web searches.
CallLog
View or update the call history, including both
incoming and outgoing calls, together with missed
calls and call details like caller ID and call durations.
Settings
You can access the device’s preferences.
...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (6/7)
Per interagire con il Content Provider che eroga i
contenuti, si usa il codice seguente:
ContentResolver cr = getContentResolver();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (7/7)
Gli oggetti ContentResolver permettono le
interrogazioni attraverso il metodo query()
query o
col metodo managedQuery()
managedQuery nel caso di una
Activity
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla
Rubrica (1/4)
// API 2
import android.provider.ContactsContract.Contacts;
// istanzio un oggetto ContentResolver
ContentResolver cr = this.getContentResolver();
// la uri che identifica il tipo di contenuto
Uri uri = Contacts.CONTENT_URI;
// nomi delle colonne da includere nella risposta
String[] projection = {Contacts.DISPLAY_NAME};
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla
Rubrica (2/4)
// è la clausola WHERE (null=tutte le righe
disponibili)
String selection = null;
// lista degli argomenti della clausola WHERE
String[] selectionArgs = null;
// è la clausola di ordinamento
String sortOrder = Contacts.DISPLAY_NAME + " ASC";
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla
Rubrica (3/4)
// ottengo un oggetto di tipo Cursor
Cursor cursor = cr.query(uri, projection, selection,
selectionArgs, sortOrder);
// ciclo di lettura dei contatti
while (cursor.moveToNext()) {
String displayName = cursor.getString(0);
// visualizza displayName
}
// chiusura del cursore
cursor.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla
Rubrica (4/4)
<manifest ...>
...
<uses-permission
android:name="android.permission.READ_CONTACTS">
</uses-permission>
</manifest>
AndroidManifest.xml
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Inserimento di un contatto
// ottengo un oggetto ContentResolver
ContentResolver cr = this.getContentResolver();
// definisco una “mappa”
ContentValues values = new ContentValues();
// Uri relativo ai contatti
Uri contacts = People.CONTENT_URI;
// aggiungo il nome alla mappa
values.put(People.NAME, "Paolo");
Scrittura del record
// inserisco il nuovo contatto
Uri uri = cr.insert(contacts, values);
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Aggiornamento di un contatto
// ottengo l'uri del contatto
Uri phoneUri = Uri.withAppendedPath(uri,
People.Phones.CONTENT_DIRECTORY);
Modifica del record
// inserisco il telefono
values.clear();
values.put(People.Phones.TYPE,
People.Phones.TYPE_MOBILE);
values.put(People.Phones.NUMBER, "1233214567");
cr.insert(phoneUri, values);
// analogamente si procede per l'email
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Cancellazione di un contatto
“To delete a single record, call
ContentResolver.delete() with the URI of a specific
row”
“To delete multiple rows, call
ContentResolver.delete() with the URI of the type of
record to delete”
Da fare
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Corso Base
5 minuti di pausa
Maurizio Cozzetto, Francesco Sarasini