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:
# 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á!

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?
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.
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
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
Para acessar o shell basta ir no Dev Tools
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
AUTOINCREMENT não funciona commigo uso a versão 3.6.22 do SQLite.
Alguém sabe o motivo?
Obrigado…
Oi Leandro, eu nunca vi o AUTOINCREMENT não funcionar… está dando algum ero?
Obrigado.
Achei o erro era o INTEGER. Estava digitando INTERGER.
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! *-*
Oi Alessandra!
Obrigado pelo comentário! engrandeceu o post! 🙂
Oi Felipe!
Imagina, eu que agradeço pelos seus ótimos artigos.
=)
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.
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.
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?
Oi Fernando,
Não, o banco de dados é local.
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
Obg Alessandra! Obg mesmo. não ia adivinhar nunca hauhsaushahsausas
[…] Acessando um Content Provider […]
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!
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.
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?
Olá Felipe!
Criei o programa do jeito que vc mostrou, porém estou com o mesmo erro que algumas pessoas comentaram, na linha abaixo:
public static final Uri CONTENT_URI = Uri.parse(“content://” + QuickNotesProvider.AUTHORITY + “/notes”);
No Log aparece a seguinte mensagem:
4550-4550/com.example.alexandre.quicknotes E/ActivityThread: Failed to find provider info for com.example.alexandre.quicknotes.quicknotesprovider
Você poderia me ajudar?