sexta-feira, 22 de junho de 2018

Rumo ao Certificado Android: Content Provider

Já vimos bastante da Activity, então hoje vamos ver mais um dos quatros classes bases do Android: os Content Providers. O objetivo de um Content Provider é criar uma interface para acessar dados, geralmente de um banco de dados, principalmente quando isso significa permitir que esses dados seja acessados por diversos aplicativos, inclusive dados como Agenda, alarme e outros nativos do Android. Para quem é da programação WEB, pode pensar que o Content Provider é um aplicativo REST que serve como uma interface aos dados.

Permissão
Para utilizar um Content Provider, é necessário registrar no manifesto a permissão para acessar o determinado Content Provider. Cada provider que app possuir deve ser registrado manualmente com a devida permissão de leitura/gravação.

Quando você quer dar permissão para somente leitura:
<uses-permission android:name="com.yourdomain.classedoprovider.TERMS_READ" />

Content Resolver
Content Resolver é a classe que fará a interface com o Content Provider. Qualquer classe que herdar o Context (ou ter acesso ao um objeto Context), pode usar o método getContentResolver para ter uma interface com os Provider

ContentResolver resolver = getContentResolver();

Ações
Com o Resolver, nós podemos agora realizar Queries e ações no banco de dados (limitados pela permissão). Existem quatro ações que podemos realizar:


  • Ler dados com o método query;
  • Adicionar dados com o método insert;
  • Atualizar dados com o método update;
  • Deletar dados com o método delete;


URI para Content Provider
A primeira ação é a da consulta, usando o resolver, temos o seguinte comando:

Cursor cursor = resolver.query(AppContract.CONTENT_URI,null,null,null,null);

Sendo que AppContract.CONTENT_URI é uma URI que apontará o Content Provider. Geralmente, o URI para Content Provider tem a seguinte sintaxe:

content://com.yourdomain.classedoprovider/termos

sendo:
  • content: Prefixo indicando que é um Content Provider
  • com.yourdomain.classedoprovider: é o que o Android chama de Autoridade de Conteúdo (Content Authority). É literalmente, a classe que controla os dados;
  • termos: Aqui é onde especificamos os dados que queremos acessar. Pode ter vários níveis, como tabela/id, e outras formas. Basicamente, o que vier aqui já é domínio do desenvolvedor, não mais do sistema.
Contrato
Uma das questões levantadas geralmente é o seguinte: como que eu vou saber de cabeça essa URI, ou suas composições. Se você observar o código da seção anterior, verá um AppContract que tem como uma constante a URI. 
Para padronizar essas informações, o Android recomenda criar uma classe Contract, que vai justamente manter essas informações de forma organizada e facilitar o desenvolvimento. A criação do Contrato é opcional em geral, mas para o Certificado, temos que seguir os padrões, e para a minha opnião, essa é um padrão que funciona tão bem que utilizo até fora do desenvolvimento Android.

Para acessar dados dos aplicativos próprio do Android, como Calendário, você pode encontrar na documentação os seus respectivos contratos (CalendarContract no caso)

Acessar o Content Provider
Content Provider, assim como qualquer recurso externo, precisa de tempo para ser carregado/executado. Então, assim, como vimos no caso de requisição Web, requisições ao Content provider devem utilizar um Loader ou pelo menos um AsyncTask (Exceto as que retornam um cursor, para esse, existe o CursorLoader).

Query
Agora vamos estuda o método Query mais detalhadamente:

Cursor cursor = resolver.query(uri,projection,selectionArg,sort);

Agora vamos estuda o método Query mais detalhadamente, observando seus parâmetros:
  • uri: é o URI para o Content Provider;
  • projection: contém filtro para selecionar quais colunas de uma base de dados você deseja obter. Neste parâmetro, quando usamos null, seria como ter dado um "SELECT *" no SQL;
  • selectionArg: é o filtro para selecionar os dados. No SQL, seria o equivalente ao WHERE;
  • sort: inidica se deve vir ordenado. É equivalente ao ORDER BY do SQL;
Cursor
É através do Cursor que podemos obter os dados do Content Provider. Um exemplo de código para conseguir todos os dados que retornaram pelo cursor:

while(cursor.moveToNext()){
   String str = cursor.getString("nomeCol");
   int inte = cursor.getInt(2);
}

Pontos importantes:
  • O cursor sempre inicia na posição anterior ao primeiro dado, por isso podemos usar o moveToNext já de cara sem perder dados.
  • Use o método get<tipo> de acordo com o tipo de dado;
  • Você pode usar o get<tipo> com o nome da coluna ou com o índice;
Cursor Loader
CursorLoader é uma classe derivada do AsyncTaskLoader, mas específico para as consultas com Cursor. Para criar um Cursor Loader, tenha em mente que o retorno dele é sempre um Cursor.
Em onCreateLoader, você deve retornar um novo  CursorLoader

return new CursorLoader(context,
                       forecastQueryUri,
                       MAIN_FORECAST_PROJECTION,
                       selection,
                       null,
                       sortOrder);

Pode reparar que a única diferença para o Query, é o contexto que deve ser passado por primeiro.

Nenhum comentário:

Postar um comentário