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