+Database e contentproviderProgrammazione in ambiente Android – CorsoAvanzato – Lezione 1Dr. Paolo Casoto - 2012
Sommario1. Creare un database utilizzando SQLite in ambienteAndroid2. Utilizzare i Content Provider ed i cursori perl’inte...
Accesso ai dati in Android SQLite: funge da livello di persistenza, consentendo lamemorizzazione dei dati all’interno di ...
SQLite Integrazione della libreria SQLite Db relazionale completo dal punto di vista funzionale Dati memorizzati in /da...
SQLite Libreria Open Source di ridotto impatto in termini di risorse Pensata per utilizzo mobile ed embedded all’interno...
Content Provider Consente la disaccoppiare le applicazioni dai dati Accesso ai dati mediante uno specifico URI del tipo ...
ContentValues e cursori Una istanza dell’oggetto ContentValues rappresenta unariga di valori di una tabella del db Un cu...
Utilizzare database SQLite Il modo più efficace di integrare l’accesso a db all’interno diuna applicazione Android è basa...
EsempioIstruzioni SQL, neldialetto di SQLiteIstruzioni SQL, neldialetto di SQLiteDr. Paolo Casoto - 20129
Accesso al database I metodi getWritableDatabase e getReadableDatabase diSQLiteOpenHelper consentono di ottenere una ista...
Android e DB: le regole del buonvicinato Non memorizzare contenuti binari quali file e risorseall’interno del db Memoriz...
Interrogazioni Le interrogazioni del db in Android non sono strutturate in SQLstandard, bensì mediante il metodo parametr...
EsempioSQLiteDatabase db =ManutentoriOpenHelper.getWritableDatabase();Cursor cursor =db.query(“Intervento”,{“data”,”descri...
Accesso al cursore La query inviata al db restituisce un cursore in grado diiterare fra un insieme di ContentValues risul...
Accesso al cursore Ma quali tipi possono essere estratti dal cursore ? int, long, float, double, short, … Ricordatevi c...
Inserire nuove righe Grazie al metodo insert è possibile aggiungere nuove righeal db Creazione di un oggetto ContentValu...
EsempioContentValues daInserire= new ContentValues();daInserire.put(“data”,”16-10-1982”);daInserire.put(“descrizione”, “ri...
Aggiornare le righe Utilizziamo il metodo update Creare un oggetto ContentValues con i soli valori da modificareper tutt...
Rimuovere le righe Utilizziamo il metodo delete In maniera analoga alla creazione di una query, si compongonole clausole...
E se avessi bisogno di una querySQL ? E’ possibile inviare ad un oggetto SQLiteDatabase una querySQL standard mediante il...
Esercizio Associamo alla nostra applicazione dedicata ai manutentorila possibilità di memorizzare dati all’interno del DB...
Creare un content provider Estendere la classe ContentProvider ed implementare imetodi astratti in essa definiti onCreat...
Registrare un content provider Come per Activity, Broadcast Receiver e Service (chevedremo in seguito), anche per i Conte...
Pubblicare un content provider L’URI associato a ciascun CP ne identifica l’indirizzo univoco, macome definire le azioni ...
Ma come accedere ai servizi offertida un Content Provider ? Mediante una specifica classe, la classe ContentResolver Cia...
Content provider e database Per consentire al CP di accedere alla base dati sottostante, èopportuno includere nel metodo ...
Content provider e database Le interrogazioni del CP in Android sono caratterizzate deiseguenti parametri:1. URI2. Colonn...
Content provider e database Per facilitare la costruzioni di query parametriche determinatein maniera ibrida sia dai para...
Content provider e resolver Ma come posso conoscere a livello di content resolver tutti iparametri necessari all’invio di...
Osservare le variazioni ad uninsieme di dati esposti da un CP E’ possibile registrare il proprio interesse per uno specif...
Inserire, aggiornare e rimuoverecontenuti L’implementazione del corpo dei metodi insert, update edelete del CP consente l...
CP e memorizzazione di file Le tabelle SQLite non sono adatte alla memorizzazione di filebinari Meglio collocarli all’in...
Dr. Paolo Casoto - 201233Esempio tratto da“Professional Android 4 ApplicationDevelopment”, Ed.WroxCreo il fileIdentifico i...
Visualizzare graficamente ilcontenuto di un cursore Istanze della classe CursorAdapter Espone i dati di un cursore ad un...
Esecuzione di query asincrone Le attività di query sul DB sono eseguite sul thread principaledell’applicazione Possono r...
Esecuzione di query asincrone Prima dell’introduzione del concetto di Loader ciascunaActivity disponeva di metodi per la ...
Esempio di implementazionedummyDr. Paolo Casoto - 201237Creo il CursorLoader per laspecifica queryQuery completataNon aggi...
Come utilizzare la classeLoaderManager All’interno dell’activity, in generale nel corpo del metodoonCreate, ottenere l’is...
Implementare la ricerca all’internodei contenuti della applicazione Android ha introdotto un framework per rendere sempli...
Definire cosa possa esserericercato Necessario definire una nuova risorsa XML (res/xml) di tipoSearchable Indica se la r...
… collegarlo alla activity… All’interno del file AndroidManifest.xml esplicitare: Che l’activity risponde agli intent co...
… gestire la query dell’utente Verificare se l’INTENT che ha avviato l’activity divisualizzazione dei risultati è di tipo...
Upcoming SlideShare
Loading in...5
×

Android avanzato lezione 1

1,751

Published on

Android Avanzato - Lezione 1 - Content Provider ed accesso a database

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,751
On Slideshare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Android avanzato lezione 1

  1. 1. +Database e contentproviderProgrammazione in ambiente Android – CorsoAvanzato – Lezione 1Dr. Paolo Casoto - 2012
  2. 2. Sommario1. Creare un database utilizzando SQLite in ambienteAndroid2. Utilizzare i Content Provider ed i cursori perl’interscambio di dati fra le applicazioni3. Accedere in modalità asincrona ai Content Provider4. Implementare funzionalità di ricerca5. Accedere ai Content Provider di default offerti dal sistemaDr. Paolo Casoto - 20122
  3. 3. Accesso ai dati in Android SQLite: funge da livello di persistenza, consentendo lamemorizzazione dei dati all’interno di un vero e propriodatabase relazionale. Content Provider: creano un livello superiore rispetto aisingoli db SQLite, consentendo l’astrazione delle proceduredi accesso ai dati. Astrazione rispetto ad un possibile insieme di molteplici DBDr. Paolo Casoto - 20123
  4. 4. SQLite Integrazione della libreria SQLite Db relazionale completo dal punto di vista funzionale Dati memorizzati in /data/data/<package_name>/databases Database ad accesso privato Solo la app proprietaria Attenzione alla progettazione del db, siamo in ambientemobile !!! Ridurre la ridondanza ma limitare i JOINDr. Paolo Casoto - 20124
  5. 5. SQLite Libreria Open Source di ridotto impatto in termini di risorse Pensata per utilizzo mobile ed embedded all’interno di altreapplicazioni Single tier: no client – server. Scritta in C, fa parte dello stack Android Libreria, non processo, che le singole applicazioni possonoutilizzare Colonne NON TIPATE !!! Tipizzazione a livello di rigaDr. Paolo Casoto - 20125
  6. 6. Content Provider Consente la disaccoppiare le applicazioni dai dati Accesso ai dati mediante uno specifico URI del tipo content:// … Applicazione agnostica rispetto ai dati Utilizzo solo le funzionalità offerte dal content provider, senzaporre attenzione al db sottostante Accesso ai content provider protetto da permessi e ruoli Posso accedere, ove autorizzato, ai content provider delle altreapplicazioni e del sistema in lettura e/o scritturaDr. Paolo Casoto - 20126
  7. 7. ContentValues e cursori Una istanza dell’oggetto ContentValues rappresenta unariga di valori di una tabella del db Un cursore (istanza di Cursor) consente di scorrere glioggetti ContentValues risultato di una interrogazione al db Accesso lineare agli elementi del cursore in entrambe ledirezioni Del tutto analogo a JDBC (ResultSet) ed ADO.NET(DBDataReader)Dr. Paolo Casoto - 20127
  8. 8. Utilizzare database SQLite Il modo più efficace di integrare l’accesso a db all’interno diuna applicazione Android è basato sull’utilizzo della classeSQLiteOpenHelper Nasconde allo sviluppatore le tematiche dell’accesso al db, dellaeventuale creazione di un nuovo db public void onCreate(SQLiteDatabase db) Invocato quando il db non è presente sul disco. public void onUpgrade(SQLiteDatabase db, int oldVersion,intnewVersion) Invocato quando la versione del db presente sul disco non èallineata con la versione attuale.Dr. Paolo Casoto - 20128
  9. 9. EsempioIstruzioni SQL, neldialetto di SQLiteIstruzioni SQL, neldialetto di SQLiteDr. Paolo Casoto - 20129
  10. 10. Accesso al database I metodi getWritableDatabase e getReadableDatabase diSQLiteOpenHelper consentono di ottenere una istanza deldb in lettura scrittura o solo lettura Attenzione: in caso di richiesta di db in scrittura, è importante visia un quantitativo di spazio minimo a disposizione su disco. Se il db non esiste o deve essere aggiornato,automaticamente i metodi opportuni della classe sonoinvocati. E’ possibile evitare l’utilizzo di SQLiteOpenHelper, sebbene nonsia consigliabile !!!Dr. Paolo Casoto - 201210
  11. 11. Android e DB: le regole del buonvicinato Non memorizzare contenuti binari quali file e risorseall’interno del db Memorizzare l’indirizzo della risorsa all’interno del db ed ilcontenuto della risorsa su disco Associare a tutte le tabelle una chiave univoca auto-incrementale Necessaria per l’accesso come Content ProviderDr. Paolo Casoto - 201211
  12. 12. Interrogazioni Le interrogazioni del db in Android non sono strutturate in SQLstandard, bensì mediante il metodo parametrico query dellaclasse Database con i seguenti parametri:1. Tabella di lavoro (FROM)2. Colonne da proiettare (SELECT)3. Clausola WHERE parametrizzata con il segnaposto ?4. Insieme dei valori necessari alla valorizzazione della clausolaWHERE5. Clausole GROUP BY, HAVING6. Numero massimo di record da restituire7. Ordinamento8. …Dr. Paolo Casoto - 201212
  13. 13. EsempioSQLiteDatabase db =ManutentoriOpenHelper.getWritableDatabase();Cursor cursor =db.query(“Intervento”,{“data”,”descrizione”},”fatto =?”,{“true”},null,null,null);Ottengo una istanzadel dbCerco tutti gli interventi fatti e ne richiedo data edescrizione, senza ordinamenti o raggruppamentiDr. Paolo Casoto - 201213
  14. 14. Accesso al cursore La query inviata al db restituisce un cursore in grado diiterare fra un insieme di ContentValues risultato. La navigazione e l’accesso ai dati è del tutto analogo a quantoavviene in JDBC ed ADO.NET Metodo get<Type> per l’accesso ad una specifica colonna i cuivalori sono restituiti dalla query Accesso mediante gli indici di colonna della tabella Memorizzare indici e nomi delle colonne come costanti, perrendere il codice più leggibile e di facilitata mantenibilità.Dr. Paolo Casoto - 201214
  15. 15. Accesso al cursore Ma quali tipi possono essere estratti dal cursore ? int, long, float, double, short, … Ricordatevi che è compito vostro capire come i tipi Java sianoassociabili ai tipi SQLite Attenzione al fatto che le colonne di SQLite non sono tipate epotrebbero contenere qualsiasi cosa !!! Ciascun cursore, al termine dell’iterazione degli elementi,deve essere rilasciato per liberare risorse Metodo closeAnche qui analogo amolte tecnologieper l’accesso a DBDr. Paolo Casoto - 201215
  16. 16. Inserire nuove righe Grazie al metodo insert è possibile aggiungere nuove righeal db Creazione di un oggetto ContentValues e passaggio almetodo insert Non si scrive neppure una riga di SQL E’ sufficiente, all’interno dell’oggetto ContentValues , associare aciascuna colonna un valore, come se si trattasse di una tabella dihash. Ricordatevi che le colonne non sono tipate !!!Dr. Paolo Casoto - 201216
  17. 17. EsempioContentValues daInserire= new ContentValues();daInserire.put(“data”,”16-10-1982”);daInserire.put(“descrizione”, “riparatolavello”);SQLiteDatabase db =manutentoriOpenHelper.getWritableDatabase();db.insert(“Intervento”, null, daInserire);Dr. Paolo Casoto - 201217
  18. 18. Aggiornare le righe Utilizziamo il metodo update Creare un oggetto ContentValues con i soli valori da modificareper tutte le righe che soddisfano la condizione di aggiornamento In maniera analoga alla creazione di una query, si compongono leclausole WHERE e gli argomenti da sostituire ai singolimarcaposto. db.update(“Intervento”,nuoviValori,“fatto = ?”,{“true”});Dr. Paolo Casoto - 201218
  19. 19. Rimuovere le righe Utilizziamo il metodo delete In maniera analoga alla creazione di una query, si compongonole clausole WHERE e gli argomenti da sostituire ai singolimarcaposto. db.delete(“Intervento”,“fatto = ?”,{“true”});Dr. Paolo Casoto - 201219
  20. 20. E se avessi bisogno di una querySQL ? E’ possibile inviare ad un oggetto SQLiteDatabase una querySQL standard mediante il metodo rawQuery che restituisceun cursore sui risultati della query Del tutto analogo al concetto di PreparedStatement in JDBC In generale molte funzionalità avanzate di accesso al db sonorese disponibili Avvio e conclusione di transazioni Impostazione dei parametri di concorrenza nell’accesso ai dati Gestione delle chiavi esterne e dei conflitti in fase di inserimentodei dati … da utilizzare solo per attività particolari … con parsimonia.Dr. Paolo Casoto - 201220
  21. 21. Esercizio Associamo alla nostra applicazione dedicata ai manutentorila possibilità di memorizzare dati all’interno del DB Implementare la classe ManutentoriOpenHelper Sostituire i metodi del package dao per rimuovere la generazionecasuale dei dati relativi agli interventi Implementare una classe di astrazione rispetto al DB che eseguale query di interrogazione del db e le operazioni di inserimentodi una nuova riga di intervento Predisporre l’activity necessaria alla creazione di un nuovoIntervento e collegarla alla lista degli interventi mediante unpulsante “Nuovo intervento”Dr. Paolo Casoto - 201221
  22. 22. Creare un content provider Estendere la classe ContentProvider ed implementare imetodi astratti in essa definiti onCreate query update delete insert getTypeDa mappare sulla base datisottostante. Il CP funge quindi dawrapper e garantisce astrazionedai datiDr. Paolo Casoto - 201222
  23. 23. Registrare un content provider Come per Activity, Broadcast Receiver e Service (chevedremo in seguito), anche per i Content Provider ènecessario aggiungere un riferimento all’interno del fileAndroidManifest.xml Utilizzare il tag provider per indicare un content providercon l’utilizzo degli attibuti name ed authorities Questo ultimo ha come obiettivo definire l’URI al quale il contentprovider risponderà Ciascun CP deve avere un URI univoco; per questo motivo èopportuno utilizzare come URI il package della classe cheestende il CPDr. Paolo Casoto - 201223
  24. 24. Pubblicare un content provider L’URI associato a ciascun CP ne identifica l’indirizzo univoco, macome definire le azioni che un CP può gestire ? In modo del tutto analogo a quanto avviene nel caso dei web serviceREST (REpresentational State Transfer) E.g: content:com.mobe.it.manutentorimanutentori perottenere la lista di tutti i manutentori E.g: content:com.mobe.it.manutentoriinterventi6 perottenere le informazioni relative esclusivamente all’intervento conID = 6 In generale la forma di una chiamata ad un CP è del tipocontent:NOME AUTHORITYPATH 1° LIVELLOPATH 2°LIVELLO ... La classe URIMatcher aiuta il programmatore nell’identificazionedella chiamata corretta al CPDr. Paolo Casoto - 201224
  25. 25. Ma come accedere ai servizi offertida un Content Provider ? Mediante una specifica classe, la classe ContentResolver Ciascuna applicazione può accedere al proprio ContentResolvermediante il metodo getContentResolver() della classe Context E quindi sia di una activity sia di un servizio !!! Una istanza di ContentResolver funge quindi da “consumatore”rispetto ai dati pubblicati dal Content Publisher Astrazione rispetto ai dati lato client: non mi interessa conoscere laclasse che funge da specifico Content Provider Identifico il CP mediante l’URI di riferimento Invocando il metodo query delle istanze di ContentResolver talemetodo è invocato sul corrispettivo CP, identificato, ovepresente, mediante lo specifico URIDr. Paolo Casoto - 201225
  26. 26. Content provider e database Per consentire al CP di accedere alla base dati sottostante, èopportuno includere nel metodo OnCreate la procedura dicreazione dell’istanza che estende SQLiteOpenHelper, allaquale delegare la gestione della creazione del database Il metodo getType restituisce il tipo (rappresentato comestringa) restituito dal CP in risposta ad uno specifico URI Consentire l’accesso a molteplici tipologie di oggetti dal medesimoCP Gestione degli URI non supportati dello specifico CP E.g.: authority corretta ma path di primo o secondo livello scorretti Il metodo query consente di effettuare la vera e propriainterrogazione e restituisce un cursore.Dr. Paolo Casoto - 201226
  27. 27. Content provider e database Le interrogazioni del CP in Android sono caratterizzate deiseguenti parametri:1. URI2. Colonne da proiettare (SELECT)3. ClausolaWHERE parametrizzata con il segnaposto ?4. Insieme dei valori necessari alla valorizzazione dellaclausola WHERE5. Ordinamento Grazie alle istanze della classe URIMatcher è possibileverificare l’oggetto della query analizzando i path presentiall’interno dell’URI di inputDr. Paolo Casoto - 201227
  28. 28. Content provider e database Per facilitare la costruzioni di query parametriche determinatein maniera ibrida sia dai parametri forniti sia dall’URI indicato, èpossibile utilizzare la classe SQLiteQueryBuilder Consente di costruire una query da inviare al database mescolandofra loro parametri inviati in fase di interrogazione con parametriimpostati in maniera programmatica sull’oggetto stesso E.g.:SQLiteQueryBuilder queryBuilder = newSQLiteQueryBuilder();…queryBuilder.appendWhere(“IDIntervento = ” + ID_URI);…Cursor cursor = queryBuilder.query(db, projection,“fatto = ?”,{“true”}, null, null, null);Dr. Paolo Casoto - 201228WHEREALTRA CONDIZIONE WHERE
  29. 29. Content provider e resolver Ma come posso conoscere a livello di content resolver tutti iparametri necessari all’invio di un comando query alcorrispettivo content provider ? Ad esempio le colonne, la clausola where o, banalmente, l’URI didestinazione ? Semplice: grazie alla documentazione ed ad un insieme dicostanti pubbliche da definire per ciascun provider Ma così perdo il concetto di accesso agnostico ai dati ? Si, ma considerate che per tutti i content provider di sistema èdisponibile la documentazione e per accedere ad un CP di terza partidovrete comunque conoscerne le caratteristiche. Attenzione, per default le query sono eseguite sul threadprincipale dell’applicazione !!!Dr. Paolo Casoto - 201229
  30. 30. Osservare le variazioni ad uninsieme di dati esposti da un CP E’ possibile registrare il proprio interesse per uno specificocursore di dati ottenuti interrogando un CP mediante una istanzadi ContentResolver E.g.: voglio monitorare quando si procede con la cancellazione o lamodifica di un contatto dalla rubrica. Android consente di registrare un listener che funga daosservatore rispetto ad un cursore o ad un URI di un CP Mediante, in entrambi i casi, l’utilizzo del metodoregisterContentObserver che utilizza come argomento una istanzache estende ContentObserver. Un osservatore registrato su un cursore o un CP (mediante ilcorrispettivo CR) può essere informato delle modifiche ai datied agire mediante il metodo OnChange.Dr. Paolo Casoto - 201230
  31. 31. Inserire, aggiornare e rimuoverecontenuti L’implementazione del corpo dei metodi insert, update edelete del CP consente la gestione delle richieste diinserimento, aggiornamento e cancellazione di una risorsapresente all’interno del CP Del tutto analoghi ai corrispettivi metodi su db visti nelle slideprecedenti, con l’aggiunta dell’URI parametrico per ledeterminazione dell’ID della risorsa (UPDATE e DELETE) All’interno del metodo di inserimento, aggiornamento ecancellazione DEVO prevedere l’aggiornamento di eventualiosservatori in ascolto per la specifica sorgente dati o per un suocursore Utilizzo del metodo notifyChangegetContext().getContentResolver().notifyChange(uri, null);Dr. Paolo Casoto - 201231
  32. 32. CP e memorizzazione di file Le tabelle SQLite non sono adatte alla memorizzazione di filebinari Meglio collocarli all’interno del filesystem e memorizzarne ilriferimento. Come fare ? Aggiungiamo alla tabella di riferimento una colonna “_data” checonterrà il riferimento al file per ciascuna riga Il valore NON deve essere modificabile in alcun mododall’applicazione E’ necessario operare andando a sovrascrivere il seguentemetodo all’interno della classe che funge da CPpublic ParcelFileDescriptor openFile(Uri uri, String mode)Dr. Paolo Casoto - 201232
  33. 33. Dr. Paolo Casoto - 201233Esempio tratto da“Professional Android 4 ApplicationDevelopment”, Ed.WroxCreo il fileIdentifico il file – QUIinserirete la logica che fauso del DB
  34. 34. Visualizzare graficamente ilcontenuto di un cursore Istanze della classe CursorAdapter Espone i dati di un cursore ad un oggetto grafico di tipo ListView E’ necessario, per il corretto funzionamento, che il cursore siacaratterizzato dalla presenza di una colonna “_id” Consente la modifica del cursore associato alla componentegrafica ( metodo swapCursor) Gestisce la possibilità di aggiornamento automatico delcursore con esecuzione periodica delle query diriempimento Da evitare, utilizzando piuttosto le query asincrone Blocco della reattività delle GUIDr. Paolo Casoto - 201234
  35. 35. Esecuzione di query asincrone Le attività di query sul DB sono eseguite sul thread principaledell’applicazione Possono richiedere molto tempo e rendere inutilizzabile e pocoreattiva la GUI E’ quindi necessario eseguire alcune interrogazioni in modalitàasincrona, spostando l’esecuzione su un thread secondario Per questo motivo è possibile utilizzare la classe Loader, disponibileper ciascuna attività mediante il LoaderManager Nello specifico è possibile utilizzare una specifica sottoclasse diLoader, la classe CursorLoader, finalizzata al caricamento di uncursore in risposta ad una query su uno specifico CP… In generale sarebbe meglio utilizzare questo approccio…perOGNI QUERYDr. Paolo Casoto - 201235
  36. 36. Esecuzione di query asincrone Prima dell’introduzione del concetto di Loader ciascunaActivity disponeva di metodi per la gestione del caricamentoasincrono dei dati Oggi tali metodi sono deprecati: managedQuery estartManagingCursor La classe CursorLoader funge anche da osservatore rispettoalle variazioni ai dati di un cursore. Rimpiazza le funzionalità del ContentObserver Per utilizzare un CursorLoader è necessario implementarel’interfaccia LoaderManager.LoaderCallbacks tipatarispetto allo specifico oggetto da caricare In questo caso un oggetto CursorDr. Paolo Casoto - 201236
  37. 37. Esempio di implementazionedummyDr. Paolo Casoto - 201237Creo il CursorLoader per laspecifica queryQuery completataNon aggiornate la UI dall’interno deimetodi descritti  Sono in esecuzioneall’interno di un altro thread, se non inpresenza di sincronizzazione !!!
  38. 38. Come utilizzare la classeLoaderManager All’interno dell’activity, in generale nel corpo del metodoonCreate, ottenere l’istanza del LoaderManager.LoaderManager loaderManager = getLoaderManager(); Richiedere al manager del caricamento di gestire un nuovostrumento di caricamento dati, generato a partiredall’interfaccia LoaderCallbacks descrittaloaderManager.initLoader(ID, …,interventiLoaderCallbacks); Se il Loader richiesto mediante l’ID specificato non è statogià creato dall’activity, il sistema invoca il metodoonCreateLoader del corrispettivo callback.Dr. Paolo Casoto - 201238Ricaricate il loader senecessario con ilmetodo restartLoader
  39. 39. Implementare la ricerca all’internodei contenuti della applicazione Android ha introdotto un framework per rendere semplice laricerca all’interno dei contenuti esposti da un contentprovider Ricerca che ha molteplici strumenti grafici mediante i qualiessere eseguita Barra di ricerca (o dialog di ricerca): si sovrappone allabarra del titolo in risposta alla pressione del tasto fisico diricerca ovvero in risposta all’invocazione del metodoonSearchRequested dell’activity Vista di ricerca: elemento grafico utilizzabile dall’utente inqualsiasi punto della propria UI Widget per la ricerca veloceDr. Paolo Casoto - 201239
  40. 40. Definire cosa possa esserericercato Necessario definire una nuova risorsa XML (res/xml) di tipoSearchable Indica se la ricerca debba essere eseguita anche conriconoscimento vocale, con quali suggerimenti perl’autocompletamento,et al.<?xml version=”1.0” encoding=”utf-8”?><searchablexmlns:android=”http://schemas.android.com/apk/res/android”android:label=”@string/nome”android:hint=”@string/suggerimento”></searchable>Dr. Paolo Casoto - 201240
  41. 41. … collegarlo alla activity… All’interno del file AndroidManifest.xml esplicitare: Che l’activity risponde agli intent con azioneandroid.intent.action.SEARCH Che l’activity è di tipo singleTop, in modo da evitare che ricerchesuccessive creino una stack di istanze multiple della medesimaactivity Indicare rispetto a quale risorsa Searchable vogliamo abilitarel’activity<meta-data android:name=”android.app.searchable”android:resource=”@xml/searchable”/> Indicare quale activity, all’interno della applicazione, sia chiamata avisualizzare i risultati di una ricerca <meta-data android:name=”android.app.default_searchable”android:value=”.InventarioSearchActivity”/>Dr. Paolo Casoto - 201241
  42. 42. … gestire la query dell’utente Verificare se l’INTENT che ha avviato l’activity divisualizzazione dei risultati è di tipoIntent.ACTION_SEARCH Estrarre dall’intento la query dell’utente mediante l’accesso allatabella dei dati extra dell’intento con chiaveSearchManager.QUERY Attenzione !!! Lavorando con activity singleTop le ricerchemultiple non saranno gestite con l’attivazione di una nuovaistanza dell’activity, bensì con l’invio di un nuovo intento allaactivity al top dello stack Utilizzare il metodo onNewIntent per gestire l’eventuale nuovaquery dell’utenteDr. Paolo Casoto - 201242

×