You are on page 1of 29
anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: translated by Google Esta pagina foi traduzida pela API Cloud Translation Switch to English (ieloud.google.com/translate/2hl=pt-br). Fundamentos do provedor de conteudo O provedor de contetido gerencia 0 acesso a um repositério central de dados. Um provedor é parte de um aplicativo para Android, que, em geral, fornece a prépria IU para trabalhar com os. dados. No entanto, os provedores de contetido séo usados principalmente por outros aplicativos, que acessam o provedor usando um objeto cliente do provedor. Juntos, provedores e clientes do provedor oferecem uma interface padrao e consistente para dados que também lida com a comunicagao entre processos e protege o acesso a dados. Normalmente, vocé trabalha com provedores de contetido em um destes dois cenérios: implementando um cédigo para acessar um provedor de contetido existente em outro aplicativo ou criando um novo provedor de contetido no seu aplicativo para compartilhar dados com outros aplicativos. Esta pagina aborda os conceitos basicos do trabalho com provedores de conteiido existentes. Para saber mais sobre a implementagao de provedores de conteiido nos seus préprios aplicativos, consulte Criar um provedor de conteudo (https:/developer.android.com/guide/topics/providersicontent-provider-creating?hI=pt-br). Este topico descreve os conceitos basicos dos seguintes assuntos: * Como os provedores de contetido funcionam. * AAPlusada para recuperar dados de um provedor de conteudo. * AAPlusada para inserir, atualizar ou excluir dados em um provedor de contetdo. * Outros recursos de API que facilitam o trabalho com provedores. do geral hitpsvldeveloper androlt.com/guldeltoplesiproviders/content-provisr-basies ?h=pt sn9 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Um provedor de contetido apresenta dados a aplicativos externos na forma de uma ou mais tabelas similares as que so encontradas em um banco de dados relacional. Uma linha representa uma instncia de algum tipo de dados que o provedor coleta, e cada coluna na linha representa um dado individual coletado por uma instancia. Um provedor de contetido coordena 0 acesso a camada de armazenamento de dados no seu aplicativo para varias APIs e componentes diferentes. Conforme ilustrado na figura 1, eles incluem o seguinte: hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept Compartilhamento do acesso aos dados do seu aplicativo com outros aplicativos Envio de dados a um widget Retorno de sugestées de pesquisas personalizadas para o aplicativo por meio do framework de pesquisa usando SearchRecentSuggestionsProvider (https:/ideveloper. android.com/reference/androidicontent/SearchRecentSuggestionsProvider?! I=pt-be) Sincronizagao dos dados do aplicativo com seu servidor usando uma implementagao de AbstractThreadedSyncAdapter (https:/ideveloper.android.com/reference/android/content/AbstractThreadedSyncAdapter?hI=pt-br) Carregamento de dados na sua IU usando um CursorLoader (https:/ideveloper.android.comireference/androidicontent/Cursorloader?hi=pt-br) MeO Creer Oe Oe ec - DEORE) Pron 2129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Figura 1. Relagao entre um provedor de contetido e outros componentes. Acessar um provedor Quando quiser acessar dados em um provedor de contetido, use o objeto ContentResolver (https:/developer.android.com/reference/androidicontent/ContentResolver?hl=pt-br) no Context (https:/developer.android.com/reference/androidicontent/Context?hkpt-br) do aplicativo para se comunicar com o provedor como cliente. © objeto ContentResolver se comunica com o objeto do provedor, uma insténcia de uma classe que implementa ContentProvider (https:/developer.android.com/reference/androidicontent/ContentProvider?hl=pt-br) . O objeto do provedor recebe solicitagdes de dados de clientes, realiza a ago solicitada e retorna os resultados. Esse objeto tem métodos que chamam métodos de nome idéntico no objeto do provedor, uma instancia de uma das subclasses concretas da ContentProvider. Os, métodos ContentResolver fornecem as funcées basicas "CRUD" (crier, recuperar, atualizar e excluir) de armazenamento permanente. Um padrao comum de acesso ao ContentProvider a partir da IU é usar um CursorLoader (https:/ideveloper.android.com/reference/androidicontent/CursorL oader?hl=pt-br) para executar uma consulta assincrona em segundo plano. A Activity (https:/ideveloper.android.com/reference/androidiapp/Activity?hi=pt-br) Ou Fragment (https:fideveloper.android.com/reference/androidiapo/Fragment?hi=pt-br) na sua IU chama um CursorLoader para a consulta, que, por sua vez, recebe 0 ContentProvider usando o ContentResolver. Isso permite que a IU continue disponivel para o usudrio enquanto a consulta esta em execugao. Esse padrao envolve a interaco de varios objetos diferentes, assim como o mecanismo de armazenamento subjacente, conforme pode ser visto na figura 2. hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 3129 anvaiza, 1:30 PM Fundamentos do provador de conteide | Android Developers Eg Cer y tees + CCG erence DERE Figura 2. Interagao entre ContentProvider, outras classes ¢ armazenamento. ‘Observagi: para acessar um provedor, 0 aplicativo geralmente precisa solicitar permissées especificas no arquivo de manifesto. Esse padrao de desenvolvimento é descrito com mais detalhes na seco Permissdes do provedor de contetdo (##Permissions). Um dos provedores integrados na plataforma Android é o Provedor de diciondrio do usuario, que armazena as palavras ndo padro que o usuario quer manter. A tabela 1 mostra como os dados podem ser exibidos nesta tabela do provedor: Tabela t:exemplo de tabela do dicionério do usuario. do aor palavra -° .._frequéncialocalidade_ID aplicativo mapreduce usudriot 100 enus 1 ntps:ideveloperandrold.conyguldoRoplsiprovidersicontent provider-basles h=pt-br 429 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: precompilerusudriols 200 fFR 2 applet —usudrio2 225 fCA 3 const usuériol 255 pLBR 4 int vusuérioS 100 enuUkK 5 Na tabela 1, cada linha representa uma instncia de uma palavra nao encontrada em um dicionario padréo. Cada coluna representa um dado dessa palavra, como a localidade em que ela foi encontrada pela primeira vez. Os cabegalhos da coluna so nomes de coluna armazenados no provedor. Portanto, para se referir & localidade de uma linha, por exemplo, consulte a coluna locale. Para esse provedor, a coluna _ID serve como uma coluna de chave priméria que o provedor mantém automaticamente. Para ter acesso a uma lista das palavras e as localidades delas no Provedor de dicionario do usuério, chame ContentResolver .query(.) (https:/developer.android.com/reference/android/content/ContentResolver?hI=pt- briéquery(android.net. Uri %¢20java lang, String?45B%SD, %20android,os. Bundle, %20android.os.CancellationSign al)) O método query() chama o método ContentProvider .query(), (https:/developer.android.com/reference/androidicontent/ContentProvider?hl=pt- br#query(android.net. Uri,%20java.lang.String%SB%SD,%20android.os.Bundle, %20android.os.CancellationSign al) definido pelo Provedor de dicionario do usuario. As linhas de cédigo a seguir mostram uma chamada ContentResolver .query(): Kotlin (##kotlin) Java (#java) /1 Queries the UserDictionary and returns results cursor = getContentResolver() .query( UserDictionary.Words.CONTENT.URI, // The content URI of the words table Projection, // The columns to return for each row selectionClause, HJ Selection criteria selectionArgs, // Selection criteria sortOrder) ; // The sort order for the returned rows hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 529 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: ATabela 2 mostra como os argumentos de query(Uri, projection, selection, selectionArgs, sortOrder) correspondem a uma instrugdo SQL SELECT: Tabela 2: query() em comparagao com a consulta SQL. alavra- Argumento A chave/parémetroNotes query() SELECT uri FROM table_name Uri é mapeado para a tabela no provedor table_name. projection col, col, col,... projection é uma matriz de colunas incluida para cada linha recuperada. selection WHERE col = _ selection especifica os critérios para selecionar linhas. value selectionArgsNenhum equivalente. ‘Argumentos de selegao substituem marcadores ? na cléusula de selegao. sortOrder ORDER BY col, _sortOrder especifica a ordem em que as linhas aparecem no col,... Cursor {https:/developer.android.comireference/androididatabase/Cursor? hl=pt-br) retornado, URIs de conteudo Um URI de contetido é um URI que identifica dados em um provedor. URIs de contetido incluem o nome simbélico de todo o provedor (a autoridade) e um nome que aponta para uma tabela (um caminho). Ao chamar um método cliente para acessar uma tabela em um provedor, 0 URI de contetido da tabela é um dos argumentos. Nas linhas de cédigo anteriores, a constante CONTENT_URT (https:/developer.android.com/reference/androidiprovider/UserDictionary Words ?hlept-bré#CONTENT_URI) hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 629 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: contém o URI de contetido da tabela Words do Provedor de dicionario do usuario. © objeto ContentResolver (https:/ideveloper.android.com/reference/androidcontent/ContentResolver?hi-pt-br) analisa a autoridade do URI e a usa para resolver o provedor, comparando a autoridade a uma tabela de provedores conhecidos do sistema. O ContentResolver pode enviar os argumentos da consulta ao provedor correto. ContentProvider (hitps:/kdeveloper.android.com/reference/androidicontent/ContentProvider?hI=pt-br) usa 0 caminho que é parte do URI de contetido para escolher a tabela que ser acessada. Um provedor geralmente tem um caminho para cada tabela que expée. Nas linhas de cédigo anteriores, o URI completo da tabela Words é: content: //user_dictionary/words * Astring content: // 6 0 esquema, que esta sempre presente e identifica isso como um URI de contetido. + Astring user_dictionary é a autoridade do provedor. * Astring words é 0 caminho da tabela Muitos provedores permitem acessar uma tinica linha em uma tabela anexando um valor de ID ao final do URI. Por exemplo, para recuperar uma linha em que _ID seja 4 do Provedor de dicionario do usuario, use este URI de contetide: Kotlin (#kotlin) Java (java) Ura singleUri = ContentUris.withAppendedId(UserDictionary.Words .CONTENT_URI, 4) ; Com frequéncia, vocé usa valores de ID ao recuperar um conjunto de linhas e depois quer atualizar ou excluir uma delas. Observagao: as classes Uri (https:/ideveloper. android. com/reference/androidnet/Uri?hl=pt-br) e Uri. Builder (https:/Aleveloper.android.com/reference/androidine/Uri.Builder?hI=pt-br) contém métodos de conveniéncia para construir objetos URI bem formados a partir de strings. A classe ContentUrie (https:/ideveloper. android. com/reference/androidicontent/ContentUris?hi=pt-br) contém métodos hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept m9 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: convenientes para anexar valores de ID a um URI. O snippet anterior usa witha (https:/developer.android.com/reference/androidicontent/ContentUristhi=pt- britwithppendedid(android.net.Uri,%20long)) para anexar um ID a0 URI de contetido do Provedor de dicionério do usuario. yendedtd(), Recuperar dados do provedor Esta segdo descreve como recuperar dados de um provedor usando o provedor de dicionario do usuario como exemplo. Por uma questo de clareza, os snippets de cédigo nesta seco chamam ContentResolver.query(). (https:/developer.android.com/reference/androidicontent/ContentResolver?hl=pt- britquery(android.net.Uri,%620java.lang,String%5B%5D, %20android.os. Bundle, %20android.os.CancellationSign al) na linha de execugao de IU. No entanto, no cédigo real, faga consultas de forma assincrona em uma linha de execugao separada. & possivel usar a classe CursorLoader (https:/developer.android.com/reference/androidicontent/CursorLoader’ no guia Carregadores (https:/ideveloper. android. com/guide/components/loaders? linhas de cédigo so apenas snippets. Elas nao mostram uma inscrigao completa. 3t-br), descrita em mais detalhes tbr). Além disso, as Para recuperar dados de um provedor, siga estas etapas basicas: 1. Solicite acesso de leitura para o provedor. 2. Defina 0 cédigo que envia uma consulta ao provedor. Solicitar permissdo de acesso de leitura Para recuperar dados de um provedor, seu aplicativo precisa de permissdo de acesso de leitura para 0 provedor. Nao é possivel solicitar essa permissao no momento da execugao. Em vez disso, vocé precisa especificar que precisa dessa permissao no manifesto usando o elemento (https:/developer.android.com/quide/topics/manifestluses-permission-element?hk-pt-br) € O nome de permissao exato definido pelo provedor. ‘Ao especificar esse elemento no manifesto, vocé solicita essa permissao para o aplicativo. Quando os usuarios instalarem o aplicativo, eles concederdo essa permissao implicitamente. hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 8129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Para encontrar o nome exato da permissao de acesso de leitura do provedor que vocé esta usando, bem como os nomes de outras permissdes de acesso usadas pelo provedor, consulte a documentagao do provedor. papel das permissdes no acesso a provedores ¢ descrito com mais detalhes na seco Permissées do provedor de contetido (#Permissions). 0 Provedor de dicionario do usuario define a permissao android. permission.READ.USER_DICTIONARY no arquivo de manifesto. Portanto, um aplicativo que queira ler pelo provedor precisa solicitar essa permissao. Criar a consulta A préxima etapa da recuperagao de dados de um provedor é construir uma consulta. O snippet a seguir define algumas variaveis para acessar 0 Provedor de dicionério do usuario: Kotlin (itkotlin) Java ‘tjava) 11 A “projection” defines the colunns that are returned for each row String[] mProjection = { UserDictionary.Words._ID, // Contract class constant for the ID column name UserDictionary.Words.WORD, // Contract class constant for the word column nam UserDictionary.Words.LOCALE // Contract class constant for the locale column n vi // Defines a string to contain the selection clause String selectionClause = null; // Initializes an array to contain selection argunents String[] selectionArgs = {°°}; O snippet a seguir mostra como usar ContentResolver .query()) (https:/developer. android.com/reference/androidicontent/ContentResolverhl=pt- britquery(android.net. Uri, %620java.lang.String%5B%5D,%20android.os. Bundle, %20android.os.CancellationSign al) , tendo o Provedor de diciondrio do usuario como exemplo. Uma consulta de cliente do provedor 6 semelhante a uma consulta SQL e contém um conjunto de colunas para retornar, um conjunto de critérios de selegao e uma ordem de classificagao. 929 hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: conjunto de colunas retornado pela consulta ¢ chamado de projegao, e a variavel & mProjection. A expresso que especifica as linhas a recuperar é dividida em uma clausula de selegao e em argumentos de selegao. A clausula de selegao é uma combinagao de expresses lagicas e booleanas, nomes de colunas e valores. A variavel é mSelectionClause. Se vocé especificar 0 parametro substituivel ? em vez de um valor, o método de consulta recuperara o valor da matriz de argumentos de selegao, que é a variavel mSelectionArgs. No préximo snippet, se 0 usuario nao inserir nenhuma palavra, a cldusula de selego sera definida como null e a consulta retornaré todas as palavras no provedor. Se o usuario inserir uma palavra, a clausula de selegao seré definida como UserDictionary.Words.WORD + " = 2" eo primeiro elemento da matriz de argumentos de seleco sera definido como a palavra que 0 usuario inserir. Kotlin (##kotlin) Java (java) Ie * This defines a one-element String array to contain the selection argument * String[] selectionArgs = {""}; // Gets a word from the UL searchString = searchWord.getText().toString() ; // Remember to insert code here to check for invalid or malicious input // If the word is the empty string, gets everything if (TextUtils.istmpty(searchString)) { // Setting the selection clause to null returns all words selectionClause = null; selectionArgs[@] } else { // Constructs a selection clause that matches the word that the user entered selectionClause = UserDictionary.Words.WORD + " = 7 // Moves the user's input string to the selection arguments selectionArgs[@] = searchString; // Does @ query against the table and returns a Cursor object mCursor = getContentResolver() .query( hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 30128 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: UserDictionary.Words.CONTENT_URI, // The content URI of the words table Projection, // The columns to return for each row selectionClause, // Either null or the word the user entered selectionArgs, // Either empty or the string the user entere sortOrder) ; // The sort order for the returned rows // Sone providers return null if an error occurs, others throw an exception if (null == mCursor) ( I * Insert code here to handle the error. Be sure not to use the cursor! You can * call android.util.Log.e() to log this error / // Tf the Cursor is empty, the provider found no matches } else if (mCursorgetCount() < 1) { i * Insert code here to notify the user that the search is unsuccessful. This is % an error. You can offer the user the option to insert @ new row, or re-type * search term * } else { // Insert code here to do something with the results Essa consulta é andloga a seguinte instrugao SQL: SELECT _ID, word, locale FROM words WHERE word = ORDER BY word ASt Nesta declaraco SQL, os nomes de coluna reais so usados no lugar de constantes de classes de contrato. Proteger contra entradas maliciosas Se os dados gerenciados pelo provedor de contetido estiverem em um banco de dados SQL, incluindo dados nao confiaveis externos em instrugdes SQL brutas, podera levar a injecao de SOL. hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 19 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Considere a seguinte cléusula de selecao: Kotlin (#kotlin) Java ‘tjava) // Constructs a selection clause by concatenating the user's input to the column na String selectionClause = "var = " + userInput; Se vocé fizer isso, vocé permitira que o usuario concatene SQL malicioso na sua instrugao SQL. Por exemplo, o usuario pode inserir "nothing; DROP TABLE *;” para mUserInput, o que resulta na clausula de selegao var = nothing; DROP TABLE *; Como a clausula de selegdo ¢ tratada como uma instrugao SQL, isso pode fazer com que o provedor apague todas as tabelas no banco de dados SQLite em questo, a menos que 0 provedor esteja configurado para capturar tentativas de injegao de SQL (https:vien. wikipedia. org/wiki/SQL_injection). Para evitar esse problema, use uma cléusula de selecdo que tenha ? como um parametro substituivel e uma matriz de argumentos de selegao separada. Dessa forma, a entrada do usuario ¢ vinculada diretamente a consulta em vez de ser interpretada como parte de uma instrugao SQL. Pelo fato de nao ser tratada como SQL, a insergdo do usuario nao injetara SQL malicioso. Em vez de usar a concatenagao para incluir a insergio do usuario, use esta cléusula de selegao: Kotlin (#kotlin)Java (java) // Constructs @ selection clause with a replaceable parameter String selectionClause = "var = 7 Configure a matriz de argumentos de selegao desta maneira Kottin (itkotlin) Java ‘Hjava) // Defines an array to contain the selection arguments hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 1229 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: String[] selectionArgs = {""}; Insira um valor na matriz de argumentos de selegao desta maneira: Kotlin (##kotlin) Java (#java) /1 Sets the selection argument to the user's input selectionArgs[@] = userInput; Uma cldusula de sele¢éio que use ? como parametro substituivel e uma matriz de argumentos de selegdo é a maneira mais recomendada de especificar uma selegéio, mesmo que o provedor nao seja baseado em um banco de dados SL. Exibir resultados da consulta O método cliente ContentResolver.query(). (https:/developer.android.com/reference/android/content/ContentResolver?hI=pt- bri#query(android.net. Uri %¢20java lang String'45B%SD, %20android. os. Bundle, %20android.os.CancellationSign all) sempre retorna um Cursor (https:/Aioveloper android, com/reference/androididatabase/Cursor?hl=pt-br) contendo as colunas especificadas pela projegao da consulta para as linhas que atendem aos critérios de selegao da consulta. Um objeto Cursor fornece acesso de leitura aleatério as linhas e colunas que ele contém. Com os métodos Cursor, é possivel iterar as linhas nos resultados, determinar 0 tipo de dados de cada coluna, extrair os dados de uma coluna e examinar outras propriedades dos resultados. Algumas implementagdes de Cursor atualizam automaticamente o objeto quando os dados do provedor mudam, acionam métodos em um objeto observador quando 0 Cursor muda, ou ambos. ‘Observagio:um provedor pode restringir 0 acesso a colunas com base na natureza do objeto que faz a consulta. Por exemplo, 0 Provedor de contatos restringe o acesso de algumas colunas a adaptadores de sincronizagao para que eles ndo sejam retornados a uma atividade ou um servigo. hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 13129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: ‘Se nenhuma linha corresponder aos critérios de selego, o provedor vai retornar um objeto Cursor para o qual Cursor.getCount(), (https:/ideveloper.android.com/reference/androididatabase/Cursor?hl=pt-britgetCount() & O, ou seja, um cursor vazio. Se ocorrer um erro interno, os resultados da consulta dependerao do provedor especifico. Ela pode retornar null ou gerar uma Exception (https:/developer.android.com/reference/java/lang/Exception?hl=pt-br) Como um Cursor é uma lista de linhas, uma boa maneira de exibir 0 contetido de um Cursor & vinculd-lo a um ListView (https:/developer.android, com/reference/android/widget/istView?! usando um SimpleCursorAdapter (https:/developer.android.com/reference/android/widget/SimpleCursorAdapter?hI=pt-br).. O snippet a seguir continua o cédigo do snippet anterior. Ele cria um objeto SimpleCursorAdapter contendo 0 Cursor recuperado pela consulta e define esse objeto para ser o adaptador de um ListView. Kotlin (#kotlin) Java (java) // Defines @ list of columns to retrieve from the Cursor and load into an output ro String[] wordListcolums = { UserDictionary.Words.WORD, // Contract class constant containing the word col UserDictionary.Words.LOCALE // Contract class constant containing the locale h // Defines a list of View IDs that receive the Cursor columns for each row int[] wordListItems = { R.id.dictWord, R.id.locale}; 11 Creates a new SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter( getapplicationContext(), // The application's Context object R.layout .wordlistrow, 1/ & Tayout in XML for one row in the Li mCursor, // The result from the query wordListColums, // & string array of column names in the wordListItens, // An integer array of view IDs in the r 8); // Flags (usually none are needed) // Sets the adapter for the ListView wordlist. setAdapter (cursorAdapter) ; hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept +4129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Observagao: para reverter uma ListView com um Cursor, o cursor precisa conter uma coluna denominada ID. Por isso, a consulta mostrada anteriormente recupera a coluna _1D da tabela Words, mesmo que ListView nao a exiba. Essa restticao também explica por que a maioria dos provedores tem uma coluna .10 ara cada tabela. Receber dados dos resultados da consulta ‘Além de mostrar os resultados da consulta, é possivel usé-los para outras tarefas. Por exemplo, 6 possivel recuperar grafias do Provedor de diciondrio do usuério e, em seguida, procurd-las em outros provedores. Para fazer isso, itere as linhas no Cursor (https://developer.android.com/reference/androididatabase/Cursor?hl=pt-br), conforme mostrado no exemplo a seguir: Kotlin (#kotlin)Java tjava) // Determine the column index of the column named “word int index = mCursor .getColumnIndex(UserDictionary.Words.WORD) ; I * Only executes if the cursor is valid. The User Dictionary Provider returns null * an internal error occurs. Other providers might throw an Exception instead of re “ if (meursor != null) ¢ * Moves to the next row in the cursor. Before the first movement in the cursor * “row pointer” is -1, and if you try to retrieve data at that position you ge * exception. * while (mCursor.moveToNext()) { // Gets the value from the columa newiiord = mCursor .getString(index) : // Insert code here to process the retrieved word 11 End of while loop + } else { hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 49129 anv2i24, 1:90 PM Fundamentos do pravedor de contelido | Android Developers: // Insert code here to report an error if the cursor is null or the provider th ‘As implementagées Cursor contém varios métodos "get" para recuperar diferentes tipos de dados do objeto. Por exemplo, o snippet anterior usa getString() (https:/ideveloper.android.com/reference/androididatabase/Cursor?hl=pt-bré#getString(int)). Elas também tém um método getType(). (https:/ideveloper.android.com/reference/androididatabase/Cursor?hl=pt-bré#getTypetint)) que retorna um valor indicando 0 tipo dos dados da coluna. Permiss6es do provedor de conteudo O aplicativo de um provedor pode especificar as permissdes que outros aplicativos precisam ter para acessar os dados do provedor. Essas permissGes informam ao usuario quais dados um aplicativo tenta acessar. Com base nos requisitos do provedor, outros aplicativos solicitam as permissdes de que precisam para acessar o provedor. Os usuérios finais vero as permissdes solicitadas quando instalarem o aplicativo. Se o aplicativo de um provedor nao especificar nenhuma permissao, outros aplicativos nao terao acesso aos dados do provedor, a menos que 0 provedor seja exportado. Além disso, os componentes no aplicativo do provedor sempre tém acesso total de leitura e gravagao, independentemente das permissdes especificadas. 0 Provedor de dicionério do usuério precisa da permissio android. permission .READ.USER_DICTIONARY para recuperar dados dele. O provedor tem uma permissao android. permission.WRITE_USER_DICTIONARY separada para inserir, atualizar ou excluir dados. Para ter as permissées necessérias para acessar um provedor, um aplicativo as solicitara com um elemento suses-permission> (https:/developer.android.com/guide/topics/manifestuses-permission-element?hI=pt-br) no arquivo de manifesto. Quando o gerenciador de pacotes do Android instala o app, 0 usuario precisa aprovar todas as permissdes solicitadas. Se o usuario aprovar, o gerenciador de pacotes continuaré a instalagao. Se 0 usudrio nao aprovar, o gerenciador de pacotes interrompera a instalacao. O elemento de exemplo a seguir solicita acesso de leitura ao Provedor de dicionério do usuario: hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 46129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: O impacto das permissdes no acesso do provedor é explicado com mais detalhes em Dicas de seguranga (https:/developer.android.comiguide/topics/securitysecurity ?h=pt-br) Inserir, atualizar e excluir dados Do mesmo modo que vocé recupera dados de um provedor, também usa a interago entre um cliente do provedor e o ContentProvider (https:/developer.android.com/reference/androidicontent/ContentProvider?hi=pt-br) do provedor para modificar dados. Vocé chama um método de ContentResolver (https:/developer.android.com/reference/androidicontent/ContentResolver?hl=pt-br) com argumentos que so passados para o método correspondente de ContentProvider. O provedor e o cliente do provedor processam automaticamente a seguranga e a comunicagao entre processos. Inserir dados Para inserir dados em um provedor, chame o método ContentResolver.insert() (https:/developer.android.com/reference/android/content/ContentResolver?hl=pt- britinsert(android.net. Uri,%20android,content.ContentValues)) Esse método insere uma nova linha no provedor e retorna um URI de conteido dessa linha. 0 snippet a seguir mostra como inserir uma nova palavra no Provedor de diciondrio do usuario: Kotlin (#kotlin) Java (java) // Defines a new Uri object that receives the result of the insertion Ura newr: // Defines an object to contain the new values to insert ContentValues newValues = new ContentValues(); * * Sets the values of each column and inserts the word. The arguments to the “put” * method are "column name" and "value". */ newalues.put(UserDictionary Words. APP_ID, newalues.put(UserDictionary.Words.LOCALE, 1129 hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: newValues .put(UserDictionary.Words.WORD, “insert"); NewValues .put(UserDictionary.Words FREQUENCY, "16@"); newUri = getContentResolver() .insert( UserDictionary.Words.CONTENT.URT, // The UserDictionary content URT newValues // The values to insert oF Os dados da nova linha vao para um Unico objeto ContentValues (https:ideveloper.android.com/referencelandroidicontent/ContentValues?hi-pt-br), que é semelhante a um cursor de uma linha. As colunas nesse objeto nao precisam ter o mesmo tipo de dados e, se vocé no quiser especificar um valor, poder definir uma coluna como null usando ContentValues.putNul1() (https://developer.android.com/reference/android/content/ContentValues ?hi=pt-br#putNull(java.lang.String)). O snippet anterior nao adiciona a coluna _1D, porque essa coluna é mantida automaticamente. provedor atribui um valor exclusivo de _ID para cada linha adicionada. Normalmente, os provedores usam esse valor como a chave priméria da tabela O URI de contetido retornado em newUri identifica a linha recém-adicionada com o seguinte formato: content: //user_dictionary /words/ 0 é 0 contetido de _1D da nova linha. A maioria dos provedores pode detectar essa forma de URI de contetido automaticamente e, em seguida, realizar a operagao solicitada na linha especifica Para receber 0 valor de _1D do Uri (https:/fdeveloper.android.com/reference/androidhet/Uri2hl=pt-br) retornado, chame ContentUris.parseId(). (https:/ideveloper. android.com/reference/androidicontent/ContentUris ?hi=pt-br# parseld(android.net.Uri)) Atualizar os dados Para atualizar uma linha, use um objeto ContentValues (https:/developer.android.com/reference/androidicontent/ContentValues?hl=pt-br) com os valores atualizados, assim como é feito com uma insergao e com critérios de selegdo, como em uma consulta, O método cliente usado é ContentResolver update), hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 18129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: (https:/developer.android.com/reference/androidicontent/ContentResolver?hl=pt- britupdate (android net. Uri,%620android. content. ContentValues, .20java.lang String, %20java.lang.String%6B%S o)) - So 6 necessario adicionar valores ao objeto ContentValues para as colunas que vocé esta atualizando. Se vocé quiser apagar o contetido de uma coluna, defina o valor como null. O snippet a seguir muda todas as linhas cuja localidade tem o idioma “en” para ter uma localidade nul1. 0 valor de retorno é 0 numero de linhas que foram atualizadas. Kotlin (#kotlin)Java (java) // Defines an object to contain the updated values ContentValues updateValues = new ContentValues(); // Defines selection criteria for the rows you want to update String selectionClause = UserDictionary.Words.LOCALE + " LIKE String[] selectionArgs = {"en_%"}; // Defines @ variable to contain the nunber of updated rows int rowsUpdated * * Sets the updated value and updates the selected words. * updateValues.putNull (UserDictionary Words LOCALE) ; rowsUpdated = getContentResolver() .update( UserDictionary.Words.CONTENT_URI, // The UserDictionary content URT updateValues, // The columns to update selectionClause, // The column to select on selectionArgs // The value to compare to ve Limpe a entrada do usuario a0 chamar ContentResolver.update() (https:/ideveloper.android.com/reference/androidicontentiContentResolverhl=pt- brifupdate(android net. Uri,%620android. content. ContentValues, %:20java lang String, %20java.lang.String%6B%S oy) - Para saber mais sobre isso, leia a segao Proteger-se contra entradas maliciosas (injection). Excluir dados hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 19129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Excluir linhas é semelhante a recuperar dados delas. Vocé especifica os critérios de selegao para as linhas que quer excluir e o método cliente retorna o numero de linhas excluidas. 0 snippet a seguir exclu’ linhas cujo ID do app corresponde a “user”. O método retorna o numero de linhas excluidas. ottin (#kotlin) Java, (java) // Defines selection criteria for the rows you want to delete String selectionClause = UserDictionary.Words.APP_ID + " LIKE 2°; String[] selectionArgs = {"user"}; // Defines a variable to contain the number of rows deleted int rowsDeleted = 8; // Deletes the words that match the selection criteria rowsDeleted = getContentResolver() .delete( UserDictionary.Words.CONTENT_URI, // The UserDictionary content URE selectionClause, 1/ The colunn to select on selectionArgs 1/ The value to compare to d: Limpe a entrada do usuario ao chamar ContentResolver.delete() (https:developer.android.com/reference/androidicontent/ContentResolver?hl=pt- britdelete(android net. Uri,%20java.lang String, %20java.lang.String%5B%6D)) : Para saber mais sobre isso, leia a segdo Proteger-se contra entradas maliciosas (#injection). Tipos de dados do provedor Provedores de contetido podem oferecer muitos tipos de dados diferentes. O Provedor de dicionario do usuario fornece apenas texto, mas provedores também podem oferecer os seguintes formatos: + Numero inteiro + numero inteiro longo (longo) * ponto flutuante + ponto flutuante longo (duplo) hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 20729 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: Outro tipo de dados que os provedores usam com frequéncia é um objeto binario grande (BLOB, na sigla em inglés) implementado como uma matriz de bytes de 64 KB. Para ver os tipos de dados disponiveis, consulte os métodos "get da classe Cursor (https:leveloper.android.com/reference/androididatabase/Cursor?h -br). O tipo dos dados para cada coluna em um provedor normalmente é listado na documentacao do provedor. Os tipos de dados do Provedor de dicionario do usuario so listados na documentacdo de referéncia da classe de contrato, UserDictionary.Words (https:/developer.android.com/reference/android/provider/UserDictionary.Words?hI=pt-br). As classes de contrato sao descritas na seco Classes de contrato (#ContractClasses). Também é possivel determinar 0 tipo dos dados chamando Cursor .getType()) (https:ideveloper.android.com/reference/androididatabase/Cursor?hl=pt-bri#getTypetint)) Os provedores também mantém informagées do tipo de dados MIME para cada URI de conteido que definem. Vocé pode usar as informagées do tipo MIME para descobrir se o aplicativo pode processar dados oferecidos pelo provedor ou para escolher um tipo de processamento com base no tipo MIME. O tipo MIME geralmente é necessario ao trabalhar com um provedor que contenha estruturas ou arquivos complexos de dados. Por exemplo, a tabela ContactsContract Data (https:/ideveloper.android.com/reference/androidiprovider/ContactsContract.Data?hI=pt-br) no Provedor de contatos usa tipos MIME para rotular 0 tipo dos dados de contato armazenados em cada linha. Para acessar 0 tipo MIME correspondente a um URI de contetido, chame ContentResolver .getType(.) (https:/ideveloper. android.com/reference/androidicontent/ContentResolver?hi=pt-britgetType(android.net.Uri)) Asegao Referéncia do tipo MIME (#MIMETypeReference) descreve a sintaxe de tipos MIME padrao e personalizados. Formas alternativas de acesso ao provedor Trés formas alternativas de acesso ao provedor so importantes no desenvolvimento do aplicativo: * Acesso em lote (#Batch): 6 possivel criar um lote de chamadas de acesso com métodos na classe ContentProviderOperation (https:ideveloper.android.comvreference/androidicontent/ContentProviderOperation?hipt-br) e, em seguida, aplica-los com ContentResolver .applyBatch()) hitpsvldoveloper androld.com/guldeltoplesiproviders/content-provisr-basies?hept 209 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: (httpsiideveloper.android.com/reference/androidicontent/ContentResolver?hI=pt- britapplyBatch(java.lang String, %620java. util ArrayList)) * Consultas assincronas: faga consultas em uma linha de execugao separada. Vocé pode usar um objeto CursorLoader (https:/ideveloper. android. com/reference/androidicontent/CursorLoader?hl=pt-br). Os exemplos no guia Carregadores (https://developer.android.com/guide/components/loaders?hI=pt-br) demonstram, como fazer isso. + Acesso a dados usando intents (#intents): embora nao seja possivel enviar uma intent diretamente a um provedor, é possivel envia-la para o aplicativo do provedor, que geralmente é mais bem equipado para modificar os dados do provedor. Oacesso em lote e a modificagao usando intents sao descritos nas segdes a seguir. Acesso em lote Oacesso em lote a um provedor ¢ util para inserir um grande numero de linhas, inserir inhas em varias tabelas na mesma chamada de método e para executar um conjunto de operacées entre limites de processo como uma transagao, chamada de operagao atémica. Para acessar um provedor no modo de lote, crie uma matriz de objetos ContentProviderOperation (https:/developer.android.com/reference/android/content/ContentProviderOperation?hl=pt-br) € envie-os para um provedor de contetido com ContentResolver .applyBatch( ) (https:/ideveloper. android.com/reference/androidicontent/ContentResolverhl=pt- br#fapplyBatch(java.lang.String,%20java.uti.ArrayListeandroid.content.ContentProviderOperation>)) . Transmita a autoridade (https:/ideveloper.android.com/guide/topics/manifest/provider-clement?hl=pt-britauth) do provedor de contetido para esse método, em vez de para um URI de contetido especifico. Isso permite que cada objeto ContentProviderOperation na matriz funcione com uma tabela diferente. Uma chamada para ContentResolver .applyBatch() retorna uma matriz de resultados. A descrigao da classe de contrato ContactsContract RawContacts (https:/developer.android.com/reference/android/provider/ContactsContract.RawContacts?hi=pt-br) contém um snippet de cédigo que demonstra a insergao em lote. Acesso a dados usando intents hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 2209 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: As intents podem fornecer acesso indireto a um provedor de contetdo. E possivel permitir que o usuario acesse dados em um provedor mesmo que seu aplicativo nao tenha permissdes de acesso. Para isso, recupere uma intent de resultado de um aplicativo com permissées ou ative um aplicativo que tenha permissées e permita que o usuario trabalhe nele. Receber acesso com permissées temporarias E possivel acessar dados em um provedor de contetido, mesmo que vocé nao tenha as. permissées de acesso adequadas, enviando uma intent para um aplicativo que tenha as permissdes e recebendo uma intent de resultado que contenha permissdes de URI. Essas sao permissées para um URI de contetide especifico que tém a mesma duragao da atividade que as recebeu. O aplicativo que tem permissdes permanentes concede permissdes temporarias a0 definir uma sinalizagao na intent de resultado: + Permissao de leitura: FLAG_GRANT_READ_URI_ PERMISSION (https:/ideveloper.android.comireference/androidlcontent/intent?hi=pt- brFLAG_GRANT_READ_URI_PERMISSION) + Permissao de gravagdo: FLAG GRANT_WRITE_URI. PERMISSION (https: /Aleveloper.android.com/reference/androidicontentiintent?hlept- brfFLAG GRANT WRITE_URI_PERMISSION) Observagai sssas sinalizagdes nao fornecem acesso geral de leitura ou gravagao ao provedor que tem a autoridade contida no URI de contetido. O acesso & somente para o URI propriamente dito. ‘Ao enviar URIs de contetido para outro app, inclua pelo menos uma dessas sinalizagées. AS sinalizagées oferecem os seguintes recursos para qualquer app que receba uma intent direcionada ao Android 11 (API de nivel 30) ou verses mais recentes: * Ler ou gravar os dados que o URI de contetido representa, dependendo da sinalizagao incluida na intent. * Receba bilidade do pacote (https:/Ideveloper. android. comitraining/basicsintents/package-visibilty?hi=pt-br) no app que contém © provedor de contetido que corresponde a autoridade de URI. O app que envia a intent e 0 app que contém o provedor de contetido podem ser dois apps diferentes. Um provedor define permissdes de URI para URIs de conteudo no manifesto usando o atributo android:grantUriPermissions (https:/ddeveloper.android.com/guide/topics/manifestiprovider-element?hl-pt-brttgprmsn) do elemento hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 2129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: provider> (https:/developer.android.com/guide/topicsimanifest/provider-element2hl=pt-br), assim como elemento filho (https:/ideveloper.android.com/guide/topicsimanifest/provider-element?hi=pt-br). O mecanismo de permissées de URI é explicado com mais detalhes no guia Permissdes no Android (https:/ideveloper.android.comiguide/topics/permissions/overviewhl=pt-britur). ri-permission> Por exemplo, é possivel recuperar dados de um contato no Provedor de contatos, mesmo sem a permissao READ CONTACTS (https:/developer.android.com/reference/android/Manifest.permission?hl=pt-brifREAD_CONTACTS). Vocé pode querer fazer isso em um aplicativo que envie e-mails de parabenizagao a um contato no aniversario dele. Em vez de solicitar READ CONTACTS (https:/developer.android.com/reference/android/Manifest. permission?hI=pt-br#READ_CONTACTS), que fornece acesso a todos os contatos do usuério e todas as informagées dele, permita que 0 usuario controle quais contatos seu aplicativo usa. Para isso, use 0 seguinte proceso: 1. No aplicativo, envie uma intent contendo a aco ACTION PICK (https:ideveloper.android.com/reference/androidicontentvintent2hl=pt-br# ACTION_PICK) e 0 tipo MIME “contacts” CONTENT_ITEM_TVPE (https:/ideve loper. android. comireference/android/provideriContactsContract.RawContacts?hi=pt- br#CONTENT_ITEM_TYPE) , usando o método startActivityForResult(). (https:/ideveloper.android.com/reference/android/appiActivity britstartActivityForResult(android. content. Intent, %20int)) 2. Como essa intent corresponde ao filtro de intent da atividade de “selegao" do app Pessoas, a atividade vai para o primeiro plano. 3. Na atividade de selegao, o usuario pode selecionar um contato para atualizar. Quando isso acontece, a atividade de selegao chama setResult(resultcode,_intent) (https:/ideveloper. android. comireferencefandroid/appiActivity?hi-pt-brétsetResult(int)) para configurar uma intent para retornar ao aplicativo. A intent contém o URI de contetido do contato que 0 usuario selecionou e as sinalizagées "extras" FLAG GRANT READ URT_ PERMISSION (https:/ideveloper. android. comireferencefandroidicontent/intent?hi=pt- br#FLAG_GRANT_READ_UR|_PERMISSION) Essas sinalizages concedem permissao de URI para que o aplicativo leia dados do contato a que 0 URI de contetido aponta. A atividade de selegio, em seguida, chama finish(),(https:/Adeveloper.android.com/reference/androidapoActivity2hl=pt-briffiish0) para retornar 0 controle ao aplicativo. hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 289 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: 4. Aatividade retorna ao primeiro plano, ¢ o sistema chama o método onActivityResult(), (https:ideveloper.android.com/reference/android/appiActivity?hiept- britonActivityResult(int,9620int, %20android.content.Intent)) da atividade. Esse método recebe a intent de resultado criada pela atividade de selecao no app Pessoas. 5. Com o URI de contetido da intent de resultado, ¢ possivel ler os dados do contato do Provedor de contatos, mesmo que vocé nao tenha solicitado permisséio permanente de acesso de leitura para 0 provedor no manifesto. Assim, vocé pode coletar as informagées de data de nascimento ou o enderego de e-mail do contato e enviar 0 e-mail de parabéns. Usar outro aplicativo Outra maneira de permitir que 0 usuario modifique dados sem permissdo de acesso ¢ ativar um aplicativo que tenha permissées e deixar que o usuario faca o trabalho nele. Por exemplo, o aplicativo Agenda aceita uma intent ACTION INSERT (https:/developer.android.com/reference/android/content/Intent?hi=pt-br#ACTION_INSERT), que permite ativar a interface de insergao do aplicativo. Vocé pode transmitir dados “extras” nesse intent, que 0 aplicativo usa para pré-preencher a IU. Como os eventos recorrentes tém uma sintaxe complexa, a maneira preferencial de inserir eventos no Provedor de Agenda é ativar o app Agenda com um ACTION_INSERT e depois permitir que o usuario insira 0 evento. Mostrar dados usando um app assistente Se o aplicativo tiver permissdes de acesso, vocé ainda poderé usar uma intent para exibir dados em outro aplicativo. Por exemplo, 0 aplicativo Agenda aceita uma intent ACTION VIEW (https:/developer.android.com/reference/android/content/intent?hi=pt-bri¥ ACTION_VIEW) que exibe uma data ou um evento especifico. Isso permite exibir as informagées da agenda sem precisar criar sua propria interface. Para saber mais sobre esse recurso, consulte a Visdo geral do provedor de agenda (https://developer.android.com/guide/topics/providersicalendar-provider?hI=pt-br). O aplicativo para o qual vocé envia a intent nao precisa ser o aplicativo associado ao provedor. Por exemplo, é possivel recuperar um contato do Provedor de contatos e enviar uma intent ACTION_VIEW que contenha o URI de contetido da imagem do contato para um visualizador de imagens. Classes de contrato hitosvldeveloper andeokt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 25129 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: ‘As classes de contrato definem constantes que ajudam os aplicativos a trabalhar com URIs de contetido, nomes de colunas, agées da intent e outros recursos de um provedor de contetido. As classes de contrato no sao incluidas automaticamente em um provedor. O desenvolvedor do provedor precisa defini-los e disponibilizd-los para outros desenvolvedores. Muitos dos provedores incluidos na Plataforma Android tém classes de contrato correspondentes no pacote android. provider (https:/ideveloper.android.com/reference/android/provider/package-summary?hI=pt-br). Por exemplo, o Provedor de dicionario do usuario tem uma classe de contrato UserDictionary (https:/ideveloper. android. com/referencefandroidiprovider/UserDictionary?hl=pt-br) que contém constantes de URI de contetido e de nome de coluna. O URI de contedo da tabela Words é definido na constante UserDictionary Words. CONTENT URI (https:/developer. android.com/reference/androidiprovider/UserDictionary Words ?hi=pt-br#CONTENT_URI). A classe UserDictionary.Words (https:/ideveloper.android.com/reference/androidiprovider/UserDictionaryWords?hI=pt-br) também contém constantes de nome de coluna, que so usadas nos snippets de exemplo neste guia. Por ‘exemplo, uma projegao de consulta pode ser definida da seguinte maneira: Kotlin (#kotlin)Java (java) Stringl] projection = { UserDictionary Words._ID, UserDictionary Words .WORD, UserDictionary Words. LOCALE Mi Outra classe de contrato ¢ ContactsContract (https:/ideveloper.android.com/reference/androidiprovider/ContactsContract2hl=pt-br) para o Provedor de contatos. A documentagao de referéncia dessa classe contém exemplos de snippets de cédigo. Uma das subclasses, ContactsContract Intent. Insert (https:/ideveloper.android.com/reference/androidiprovider/ContactsContract intents. Insert?hI-pt-br), 6 uma classe de contrato que contém as constantes para intents e dados de intents. Referéncia do tipo MIME Os provedores de contetido podem retornar tipos MIME padrao, strings de tipos MIME personalizados ou ambos. hitpsvldeveloper androlt.com/guldeltoplesiproviders/content-provisr-basies ?h=pt 26109 anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: s tipos MIME tém 0 seguinte formato: type/ subtype Por exemplo, 0 tipo MIME text/html conhecido tem 0 tipo text e 0 subtipo html. Se o provedor retornar esse tipo para um URI, uma consulta que usa esse URI retornaré um texto que contém tags HTML. As strings do tipo MIME personalizado, também chamadas de tipos MIME especificos do fornecedor, tém valores type e subtype mais complexos. No caso de varias linhas, 0 valor do tipo 6 sempre o seguinte: vnd.android.cursor.dir Para uma Unica linha, 0 valor de tipo é sempre o seguinte: vnd.android.cursor.item O subtype é especifico do provedor. Os provedores integrados do Android normalmente tém um subtipo simples. Por exemplo, quando o aplicativo Contatos criar uma linha para um numero de telefone, ele configurara o seguinte tipo MIME na linha: vnd.android.cursor .item/phone_v2 valor do subtipo € phone_v2. Outros desenvolvedores de provedor podem criar os préprios padrées de subtipos com base na autoridade do provedor e nos nomes da tabela. Por exemplo, considere um provedor que contenha horarios de trens. A autoridade do provedor é com.exanple. trains, e ele contém as tabelas Linet, Line2 e Line3. Em resposta ao seguinte URI de contetido para a tabela Linet: hitpsvldeveloper androlt.com/guldeltoplesiproviders/content-provisr-basies ?h=pt 2m anv2i24, 1:90 PM Fundamentos do pravedor de contalido | Android Developers: content: //com.example.trains/Linet © provedor retorna o seguinte tipo MIME: vnd.android.cursor.dir/vnd.example.1ine1 Em resposta ao seguinte URI de contetido para a linha § na tabela Line2: content: //com.example.trains/Line2/5 © provedor retorna o seguinte tipo MIME: vnd.android.cursor.item/vnd.example.1line2 ‘Amaioria dos provedores de contetido define constantes de classe de contrato para os tipos MIME que usam. A classe de contrato ContactsContract. (nttps:developer.android.com/referencelandroid/provider/ContactsContract.RawContacts?hi-pt-br) do Provedor de contatos, por exemplo, define a constante CONTENT_ITEM_TYPE (https:/developer.android.com/reference/android/provider/ContactsContract.RawContacts?hl=pt- bri#CONTENT_ITEM_TYPE) para o tipo MIME de uma linha exclusiva do contato bruto. awContacts URIs de contetdo para linhas Unicas sao descritos na sego URIs de contetido (#ContentURIs). Préxima hitosvldeveloper andeolt.comiguldeltoplesiprovisers/cantant-proviser-basies?hlept 20129 anvaiza, 1:30 PM Fundamentos do provador de conteide | Android Developers Creating a content provider -> {(https:/ideveloper android. com/guide/topics/providersfcontent-provider-creating?hl=pt-br) Cconteido e os exenplos de cédigo reste (https:/developer.android.com/license?hl sijeites aslicengas descrites na Lcenga de conteido 1t-br). wave e OpenIDK so merces registracas de Oracle e/ou suas Ultima atualizagao 2024-02-16 UTC. ntps:ideveloperandrold.conyguldoRoplsiprovidersicontent provider-basles h=pt-br 29109

You might also like