Corso Base Lezione 6 Maurizio Cozzetto, Francesco Sarasini
Database SQLite (1/2) Android provides full support for SQLite databases. Any databases you create will be accessible by name to any class in the application, but not outside the application.
Database SQLite (2/2) Bisogna estendere la classe SQLiteOpenHelper e sovrascrivere i metodi oncreate() e onupgrade()
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
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
Programmare SQLite (3/4) // per creare le tabelle si usa execsql() String sql = ""; sql = "CREATE TABLE rubrica("; // id è incrementato automaticamente sql = sql + "id INTEGER PRIMARY KEY,"; sql = sql + "nome TEXT NOT NULL,"; sql = sql + "cognome TEXT NOT NULL,"; sql = sql + "telefono TEXT NOT NULL"; sql = sql + ")"; db.execsql(sql); // da inserire in oncreate()
Programmare SQLite (4/4) public class MiaActivity extends Activity { MioDatabaseHelper miodatabasehelper; } @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); miodatabasehelper = new MioDatabaseHelper(this); }...
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
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
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();
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
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! db.close(); return; } // chiusura del database db.close(); Registrazione dei nuovi dati
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
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();
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...
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 } Scorriamo il risultato della query mediante db.close(); Il cursore
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.
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
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. content://com.android.contacts/contacts Uri dei contatti android.provider.contactscontract.contacts Package Contacts.CONTENT_URI Costante che restituisce la Uri dei contatti
Content Providers (4/7) Android dispone di diversi Content Provider built-in, quali le immagini, i contatti della rubrica, i bookmark del browser, le chiamate ricevute, i file multimediali e le impostazioni del device.
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....
Content Providers (6/7) Per interagire con il Content Provider che eroga i contenuti, si usa il codice seguente: ContentResolver cr = getcontentresolver();
Content Providers (7/7) Gli oggetti ContentResolver permettono le interrogazioni attraverso il metodo query() o col metodo managedquery() nel caso di una Activity
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};
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";
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();
Esecuzione di una query sulla Rubrica (4/4) <manifest...>... <uses-permission android:name="android.permission.read_contacts"> </uses-permission> </manifest> AndroidManifest.xml
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);
Aggiornamento di un contatto // ottengo l'uri del contatto Uri phoneuri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY); // inserisco il telefono Modifica del record 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
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
Corso Base 5 minuti di pausa Maurizio Cozzetto, Francesco Sarasini