Acessando um Content Provider

No artigo de hoje começaremos a integrar a nossa aplicação QuickNotes com o QuickNotesProvider, que criamos no artigo anterior.

Vamos começar inserindo uma anotação do usuário no banco de dados. Para fazer isso, o primeiro passo é adicionar um Listener ao botão ‘Inserir’, da seguinte forma:

        Button insertButton = (Button)findViewById(R.id.insert_button);
        insertButton.setOnClickListener(mInsertListener);

E agora, criando o objeto mInsertListener. Ele precisa ser um objeto que implementa a interface OnClickListener,. Assim, precisamos implementar o método onClick(), que será chamado assim que o usuário pressionar o botão.

     // Definindo um OnClickListener para o botão "Inserir"
     private OnClickListener mInsertListener = new OnClickListener() {
          public void onClick(View v) {
              EditText editBox = (EditText)findViewById(R.id.edit_box);
              addNote(editBox.getText().toString());
              editBox.setText("");
          }
     };

No código acima eu fiz uma chamada a um método que ainda não está implementado – o método addNote(), que recebe um String que será inserida no banco de dados. Ele será o método responsável por efetivamente “conversar” com o content provider. Vamos implementá-lo:

      /*
      * Método responsável por inserir um registro no content provider
      */
        protected void addNote(String text) {
            ContentValues values = new ContentValues();
            values.put(QuickNotesProvider.Notes.TEXT, text);  

            getContentResolver().insert(
                            QuickNotesProvider.Notes.CONTENT_URI, values);
	 }

Assim, a MainActivity fica dessa forma:

package br.com.felipesilveira.quicknotes;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.content.ContentValues;
import android.content.Intent;

public class MainActivity extends Activity {

	private static final String TAG = "QuickNotesMainActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent i = new Intent(this, WelcomeActivity.class);
        startActivity(i);

        Button insertButton = (Button)findViewById(R.id.insert_button);
        insertButton.setOnClickListener(mInsertListener);

        // adicionando um 'Hint' ao Editbox.
        EditText editBox = (EditText)findViewById(R.id.edit_box);
        editBox.setHint("Nova nota...");
     }

     // Definindo um OnClickListener para o botão "Inserir"
     private OnClickListener mInsertListener = new OnClickListener() {
          public void onClick(View v) {
        	  EditText editBox = (EditText)findViewById(R.id.edit_box);
              addNote(editBox.getText().toString());
              editBox.setText("");
          }
     };

     /*
      * Método responsável por inserir um registro no content provider
      */
	 protected void addNote(String text) {
		 ContentValues values = new ContentValues();
		 values.put(QuickNotesProvider.Notes.TEXT, text);  

		 getContentResolver().insert(
		      QuickNotesProvider.Notes.CONTENT_URI, values);
	 }
}

É importante salientar que estamos apenas inserindo o dado no banco de dados – não estamos lendo-o em nenhum lugar na nossa aplicação, ainda.

Mas como saber se o dado realmente foi inserido no banco de dados?

Vou aproveitar esta pergunta para mostrar como acessar o banco de dados pelo shell do android. Isso é muito útil para auxiliar no desenvolvimento de aplicações que lidam com banco de dados.

Acessando banco de dados através do shell

Para acessar o banco de dados pelo shell, iremos iniciar uma sessão com o comando adb shell e então usar o comando sqlite3 <caminho-do-db>. A partir daí, basta usar comandos SQL normais. Para ver a estrutura do banco de dados, o comando .schema deve ser usado. Veja no exemplo abaixo:

$ adb shell
# sqlite3 /data/data/br.com.felipesilveira.quicknotes/databases/quicknotes.db
SQLite version 3.5.9
Enter “.help” for instructions
sqlite> .schema
.schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE notes (_id INTEGER PRIMARY KEY AUTOINCREMENT,text LONGTEXT);
sqlite> select * from notes;
select * from notes;
1|teste

Como podemos ver, a primeira entrada do nosso DB está lá, então é sinal que o QuickNotesProvider está funcionando corretamente!

No próximo artigo, iremos usar o provider para ler os dados já gravados no DB para mostrá-los ao usuário. Até lá!

Desenvolvendo para Android

22 respostas to “Acessando um Content Provider”

  1. Jonatas Daniel disse:

    Cara, interessante seu post.
    Mas lendo o post me surgiu uma dúvida.
    A Google recomenda os componentes em um arquivo XML e chamá-los na tela pelo método findViewById, fazendo um casting e tal.
    Mas isso não acarreta em problema de performance se comparado ao modo de colocar o componente como atributo da tela?

  2. Oi Jonatas,
    Excelente colocação.
    Também já fiz esse questionamento, e inclusive fiz alguns testes para medir a performance dos dois casos, e esta é bem parecida. Isto porque o XML é “compilado” em tempo de compilação, e algumas otimizações em framework fazem com que a diferença de performance das duas técnicas seja praticamente inexistente.

  3. Dalton disse:

    Parabéns, todos seu artigos estão muito bem explicados. Tenho uma dúvida em relação como você acessou o shell do Android, eu uso o emulador e toda vez que tento usar o terminal para qualquer coisa, ele da acesso negado. Como você resolveu isso? Como você conseguiu acesso as permissões do terminal?

    Aguardo
    Att. Dalton

  4. Edmara disse:

    Olá Felipe!

    Parabéns pelos post…
    Tenho uma dúvida em relação como você acessou o shell do android… pois eu não consigo acessar o terminal… Vc poderia passar o acesso ao shell passo-a-passo…

    Att
    Edmara

  5. André disse:

    Para acessar o shell basta ir no Dev Tools

  6. André disse:

    ops, ali vc não consegue acesso total, o executável adb se encontra dentro de “platform-tools” na pasta do SDK, use o próprio shell do windows

  7. Leandro disse:

    AUTOINCREMENT não funciona commigo uso a versão 3.6.22 do SQLite.

    Alguém sabe o motivo?

    Obrigado…

  8. Oi Leandro, eu nunca vi o AUTOINCREMENT não funcionar… está dando algum ero?

  9. Leandro disse:

    Obrigado.

    Achei o erro era o INTEGER. Estava digitando INTERGER.

  10. Alessandra disse:

    Não sei se a dúvida do shell já foi esclarecida e como eu também já tive essa dúvida, vou passar o passo-a-passo de como eu acessei o bd pelo shell:

    1º- Antes de mais nada, o emulador deve estar em execução(online);

    2º- Vá ao Prompt de comando(no Windows) e acesse a pasta “platform-tools” do android:
    cd C:\Arquivos de programas\Android\android-sdk\platform-tools

    3º- Em seguida, digite adb shell:
    Se o emulador estiver em execução, irá aparecer o famoso “jogo-da-velha”(#).
    Caso o contrário, a seguinte mensagem irá aparecer:
    error: device not found;

    4º- Logo após o “#”, digite o caminho do seu banco de dados:
    sqlite3 /data/data/br.com.felipesilveira.quicknotes/databases/quicknotes.db
    Onde, no exemplo:
    * br.com.felipesilveira.quicknotes é o nome da package,
    * quicknotes.db é o nome do bando de dados;

    5º- Se você fez tudo certinho, irá aparecer o seguinte:
    SQLite version 3.5.9
    Enter “.help” for instructions
    sqlite>

    E Fim! Daí em diante é só digitar os comandos sql.
    (Se tiver algum erro, por favor me corrijam!)
    Espero ter ajudado! *-*

  11. Oi Alessandra!
    Obrigado pelo comentário! engrandeceu o post! 🙂

  12. Alessandra disse:

    Oi Felipe!
    Imagina, eu que agradeço pelos seus ótimos artigos.
    =)

  13. Junior disse:

    Olá Felipe, segui o seu exemplo e até este post está funcionando tudo ok, porem quando vou inserir a nota, dá erro na linha

    getContentResolver().insert(QuickNotesProvider.Notes.CONTENT_URI, values);

    O erro é: The application Quicknotes has stopped unexpectedly.
    Please try again. Force close.

    O SQLLite já vem com o SDK do Android ou preciso instalar.

  14. Flavio Sampaio disse:

    E pra ficar mais facil a dica da Alessandra.
    Crie um arquivo Shell.BAT na pasta com o comando

    adb shell

    Salve o arquivo e addicione um icone no desktop ou menu iniciar ou onde quiser.

    Quando nescessitar rodar o Shell novamente basta clicar no icone que voce criou!!!

    Felipe PARABENS PELO SEU BLOG, acredito que esta ajudando a muitos programadores que querem aprender a desenvolver applicativos para Android.

  15. Fernando Fagundes disse:

    Olá, estou com uma dúvida. Esse banco de dados ficará em um servidor e será acesso por meio de internet ou rede correto?

    E se eu quizer guardar essas informações localmente no aplicativo, o que devo utilizar?

  16. Oi Fernando,

    Não, o banco de dados é local.

  17. roberto disse:

    Felipe, muito bom o seu post. Bastante didático e prático. estou começando agora no android. Gostaria de saber onde posso encontrar uma lista com os objetos que tem no android (ex: combobox, listbox e etc).

    Grato e parabens,

    roberto

  18. Thiago disse:

    Obg Alessandra! Obg mesmo. não ia adivinhar nunca hauhsaushahsausas

  19. Thiago Tavares disse:

    Olá Felipe,

    Quando eu clico no botão de inserir (já executando a aplicação), aparece um erro dizendo que o programa fechou inesperadamente e dizendo para tentar novamente. O que pode ser?

    Abraços e obrigado!

  20. Danilo disse:

    Oi Felipe boa tarde.

    cara não consigo acessar esse banco de dados da uma mensagem assim “unable to open database” o que pode ser isso?

    Valeu.

  21. Alexandre disse:

    Olá, como eu faça para chamar o banco de dados, exemplo: criei o banco, com nome, versão e tal, dai crie uma layout par que o usuário cadastre, como eu faça para que quando o usuário clicar no botão cadastrar as informações salve no banco?

Deixe um comentário