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


Posts Relacionados

  1. Criando uma ListActivity
  2. Como usar banco de dados em uma aplicação android
  3. Content Providers
  4. Criando uma Activity secundária

17 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

Deixe um comentário