Prezado (a) Autor(a) - badlene.files.wordpress.com · Prezado (a) Autor(a), Inicia-se a produção...
Transcript of Prezado (a) Autor(a) - badlene.files.wordpress.com · Prezado (a) Autor(a), Inicia-se a produção...
Prezado (a) Autor(a),
Inicia-se a produção do Caderno de Atividades 2015.1 sob a sua
responsabilidade.
Atente-se para as informações que lhe foram passadas, através do Manual
do Autor, Template, Ambiente de Capacitação e Formatação de
Questões.
Abaixo você encontrará o padrão deste caderno. As letras em vermelho
devem ser substituídas pela sua produção. As pretas devem ser mantidas
onde e como estão. As verdes são lembretes ao longo do material, para
auxiliá-lo nesta produção. Ao final do template, será encontrada a seção de
exemplos para auxiliá-lo na construção do Caderno de Atividades. As letras
verdes e os exemplos devem ser retirados antes do envio deste arquivo à
Gerência de Produção e Conteúdo..
Observe o padrão de nomenclatura dos arquivos.
Lembre-se:
• Utilize a linguagem dialógica.
• Respeita as quantidades solicitadas em cada item.
• Não faça questões colaborativas (Ex: reúna-se em grupo, discuta
com seus colegas, em dupla responda, entre outras).
Dúvidas ao longo do processo de produção procure o gestor do seu
caderno.
Desejamos a você um excelente trabalho!
Regina Cláudia da Silva Fiorin
Diretoria de Desenvolvimento de EaD
TEMPLATE
CADERNO DE ATIVIDADES - 2015/1
Como citar esse material:
CAMPOS, Edilene Aparecida Veneruchi. Programação em dispositivos
móveis: Introdução à programação para Android. Caderno de Atividades.
Valinhos: Anhanguera Educacional, 2015.
Uma necessidade muito comum a qualquer tipo de aplicação, para
dispositivos móveis ou não é a persistência de dados.
O termo persistência de dados está relacionado com a habilidade da
aplicação de gravar dados importantes para o usuário em algum meio de
armazenamento permanente, como o disco. Assim, mesmo após o
encerramento da execução da aplicação ou do desligamento do dispositivo,
os dados poderão ser recuperados. Os meios de persistência mais utilizados
são os arquivos e as tabelas de bancos de dados.
As aplicações desenvolvidas para android têm à disposição algumas
maneiras de persistir dados. Aqui abordaremos persistência de dados
usando: o objeto SharedPreferences; armazenamento interno;
armazenamento externo; base de dados SQLite.
Usar o objeto SharedPreferences significa é utilizado quando a aplicação
tem necessidade de gravar poucos dados. Esta estratégia permite o
armazenamento de pares de valores (chave, valor). Estratégia indicada
para gravação de dados de configuração.
Usar armazenamento interno permite gravar dados na memória interna do
dispositivo. Desta forma os dados tem uso privado à própria aplicação, não
ficando visível a outras aplicações.
Já o armazenamento externo permite gravar dados em um cartão de
memória (SD). Desta forma, todos os dados poderão ser acessados.
O banco de dados SQLite permite que os dados fiquem privados à aplicação,
sendo tratados por um sistema gerenciador de dados relacionais. Por ser
relacional, os dados devem ter características que os permitam ser
organizados em tabelas (linhas e colunas).
Network connection significa que o armazenamento será feito em um
servidor web.
Persistência de dados
Trataremos das possíveis formas de persistência de dados em aplicações
para android.
1) Usando SharedPreferences
Quando se utiliza a gravação usando as preferências compartilhadas, deve-
se fazer uso de um objeto da classe SharedPreferences. Este objeto
permite a persistência dos dados usando um par (chave, valor). Os pares
ficam gravados em um arquivo XML.
Como começar a utilizar as preferências compartilhadas deve-se criar um
objeto, conforme apresentado a seguir apropriado.
Se a activity necessitar de um único arquivo de preferências compartilhadas
não é necessário informar o nome do arquivo. Deve-se informar apenas o
modo de permissão de acesso liberado. Assim, pode-se usar:
SharedPreferences prefs = getPreferences(modo);
Entretanto, se houver a necessidade de trabalhar com mais de um arquivo
de preferências compartilhadas, deve-se informar o nome do arquivo
desejado. Conform a seguir.
SharedPreferences prefs = getSharedPreferences(nome,modo);
O parâmetro nome indica o nome indica o nome do arquivo que armazenará
as preferências compartilhadas (lembrando que uma aplicação pode utilizar
vários arquivos) e o modo indica a permissão de acesso ao arquivo de
preferências compartilhadas.
Os principais modos de acesso são:
MODE_APPEND gravará novos dados em um arquivo de preferências já
existentes;
MODE_PRIVATE define que o arquivo contendo as preferências gravadas
poderá ser acessado apenas pela aplicação.
MODE_WORLD_READABLE permite que outras aplicações leiam as
preferências gravadas.
MODE_WORLD_WRITEABLE permite que outras aplicações leia e gravem
dados no arquivo de preferência.
As gravações podem ser feitas no arquivo de preferências usando a classe
SharedPreferences.Editor. Assim:
Editor editor = prefs.edit();editor.putString("chave", "valor");editor.commit();
Além do putString() existem outros métodos na classe Editor que
permitem a manipulação de dados contidos nas preferências
compartilhadas. Alguns deles são:
clear() remove todos os valores do editor
commit() confirma as gravações.
remove(String chave) remove o valor associado à chave passada
como parâmetro.
putLong(String chave, long valor) salva um valor do tipo
long nas preferências compartilhadas.
putInt(String chave, int valor) salva um valor do tipo int
nas preferências compartilhadas.
putFloat(String chave, float valor) salva um valor do tipo
float nas preferências compartilhadas.
putBoolean(String chave, boolean valor) salva um valor do
tipo boolean nas preferências compartilhadas.
Para ler os valores gravados no arquivo de preferências compartilhadas
deve-se realizar procedimento assim:
prefs.getString(“chave”, “Valor_default”);
Na linha acima, caso haja uma chave idêntica a “chave”, seu valor será
retornada. Se “chave” não existir no arquivo de preferências será retornado
o “valor_default”. Além do getString(), existem outros métodos para
recuperar dados:
getBoolean(String chave, boolean valor_default) recupera
um valor boolean correspondente á chave informada. Se a chave não
estiver cadastrada será retornado o valor_default informado.
getFloat(String chave, float valor_default) recupera um
valor float correspondente á chave informada. Se a chave não
estiver cadastrada será retornado o valor_default informado.
getInt(String chave, int valor_default) recupera um valor
int correspondente á chave informada. Se a chave não estiver
cadastrada será retornado o valor_default informado.
getLong(String chave, long valor_default) recupera um
valor long correspondente á chave informada. Se a chave não estiver
cadastrada será retornado o valor_default informado.
Apresentaremos esta estratégia de persistência, através de um projeto.
1) Criar um novo projeto android (no exemplo o projeto se chama
Tema3_Ex2, com pacote com.exercicios.tema3_ex2).
2) Atualize o arquivo activity_main.xml (em res/layout) para que fique
conforme mostrado a seguir:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.exercicios.tema3_ex2.MainActivity" >
<TextView android:id = "@+id/mensagem" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_centerHorizontal = "true" android:layout_centerVertical = "true" /> <Button android:id = "@+id/bt_gravar" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_below = "@id/mensagem" android:layout_centerHorizontal = "true" />
</RelativeLayout>
3) Atualize a classe MainActivity.java para que fique conforme mostrado
a seguir.
package com.exercicios.tema3_ex2;
import com.example.tema3_ex2.R;import android.app.Activity ;import android.content.Intent ;import android.content.SharedPreferences ;import android.os.Bundle ;import android.view.View ;
import android.view.View.OnClickListener ;import android.widget.Button ;import android.widget.TextView ;
public class MainActivity extends Activity { final static String PREFS = "arquivo1_pref" ; final static String ACESSO = "acesso" ; @Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState) ;setContentView(R.layout.activity_main);
} @Override protected void onResume () { super.onResume(); SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE); String data = prefs.getString(ACESSO, null); TextView msg = (TextView)findViewById(R.id.mensagem); Button addNameButton = (Button) findViewById(R.id.bt_gravar); if (data != null) { msg.setText("Ultimo acesso em: " + data); addNameButton.setText("Retomar a aplicação..."); } else { msg.setText("Nunca acessou a aplicação!"); addNameButton.setText ("Iniciar a aplicação..."); } addNameButton.setOnClickListener(new OnClickListener () { @Override public void onClick (View v) { Intent intent = new Intent(MainActivity.this, GravadoraDeDados.class); startActivity(intent); } }); }}
4) Crie um arquivo chamado grava.xml em res/layout, e nele acrescente
o conteúdo a seguir.
<?xml version = "1.0" encoding = "utf-8" ?><LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"android:layout_width = "match_parent"android:layout_height = "match_parent"android:orientation = "vertical"><TextViewandroid:id = "@+id/texto"android:layout_width = "match_parent"android:layout_height = "wrap_content"android:text = "@string/lb_texto" />
<Button
android:id = "@+id/bt_voltar"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text = "@string/voltar"/>
</LinearLayout>
5) Crie uma classe chamada GravadoraDeDados.java com conteúdo
conforme mostrado a seguir.
package com.exercicios.tema3_ex2;
import java.text.SimpleDateFormat;import java.util.Date;import com.example.tema3_ex2.R;import android.app.Activity ;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;
public class GravadoraDeDados extends Activity { private SharedPreferences prefs ; @Override protected void onCreate ( Bundle savedInstanceState ) { super.onCreate(savedInstanceState); setContentView (R.layout.grava_nome); prefs = getSharedPreferences(MainActivity.PREFS,MODE_PRIVATE); Button btVoltar = (Button) findViewById (R.id.bt_voltar); btVoltar.setOnClickListener (new OnClickListener () { @Override public void onClick (View v) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy HH:mm:ss"); String dataAcesso = dateFormat.format(new Date()); Editor editor = prefs.edit(); editor.putString(MainActivity.ACESSO, dataAcesso); editor.commit(); finish(); } }) ; }}
6) Altere o conteúdo do arquivo strings.xml (em res/value) acrescentando as linhas a seguir.
<string name = "nome">Nome: </string ><string name = "voltar">Voltar</string>
<string name = "lb_texto">Quando clicar no botão voltar a data e hora de acesso serão atualizadas.</string>
7) Atualize o arquivo AndroidManifest.xml para que fique assim:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tema3_ex2" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.exercicios.tema3_ex2.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.exercicios.tema3_ex2.GravadoraDeDados"/> </application></manifest>
2)Usando gravação interna ( internal storage )
É possível gravar dados em arquivos armazenados na memória interna do
aparelho. Tais dados são acessados apenas pela aplicação. Assim, se a
aplicação for desinstalada, tais dados são removidos.
Neste tipo de persistência, os dados ficam gravados em arquivos e não
precisam formar pares (chave, valor). Assim, podem-se gravar textos, por
exemplo.
Para isso, a aplicação pode fazer uso das classes disponíveis em java.io.
Para acessar um arquivo de dados utiliza-se a classe FileOutputStream,
que cria um caminho virtual até o arquivo.
Para que seja possível realizar a gravação em um arquivo interno é
necessário:
a) Para abrir um arquivo, deve-se utilizar o método
openFileOutput(nome_arquivo, modo), que consegue abrir um
determinado arquivo indicado em nome_arquivo com permissão de
acesso definida pelo modo de abertura utilizado.
FileOutputStream arq = openFileOutput(“dados.txt”, MODE_WORLD_WRITEABLE);
Os principais modos de abertura podem ser APPEND,
MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE.
b) A gravação é feita por meio de um objeto da classe
OutputStreamWriter, que permite acessar o arquivo através do caminho
virtual para gravações.
OutputStreamWriter gravador = new OutputStreamWriter(arq);gravador.write(cadeia_de_caracteres);
Para que seja possível realizar a leitura de dados de um arquivo interno é
necessário:
a) Para abrir um arquivo para leitura, deve-se utilizar o método
openFileInput(nome_arquivo), que estabelece um caminho virtual
com o arquivo indicado em nome_arquivo, definindo permissão para
leitura dos dados.
FileInputStream arq = openFileInput("dados.txt");
b) A leitura é feita por meio de um objeto da classe
InputStreamReader, que acessa o arquivo e lê uma quantidade de
caracteres.
InputStreamReader leitor = new InputStreamReader(arq);
Apresentaremos esta estratégia de persistência, através de um projeto. A
aplicação disponibiliza botões para Gravar dados em um arquivo (apagando
o que eventualmente já estiver gravado), Acrescentar dados em um
arquivo, ao final do conteúdo que eventualmente já esteja gravado; Limpar
o arquivo, apagando todo o conteúdo que eventualmente estivesse
gravado; e Mostrar o conteúdo já gravado no arquivo.
1) Criar um novo projeto android (no exemplo o projeto se chama
Tema3_internal, com pacote com.exercicios.tema3_internal).
2) Atualize o arquivo activity_main.xml (em res/layout) para que fique
conforme mostrado a seguir:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.exercicios.tema3_internal.MainActivity" >
<TextView android:id = "@+id/orientacao" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text="@string/lb_orientacao" android:layout_centerHorizontal = "true" />
<EditText android:id="@+id/entrada" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below = "@id/orientacao" android:layout_centerHorizontal = "true" />
<Button android:id = "@+id/bt_gravar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_gravar" android:layout_below = "@id/entrada" android:layout_centerHorizontal = "true" />
<Button android:id = "@+id/bt_acrescentar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_acrescentar" android:layout_below = "@id/bt_gravar" android:layout_centerHorizontal = "true" />
<Button android:id = "@+id/bt_limpar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_limpar" android:layout_below = "@id/bt_acrescentar" android:layout_centerHorizontal = "true" />
<Button android:id = "@+id/bt_mostrar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bt_mostrar" android:layout_below = "@id/bt_limpar" android:layout_centerHorizontal = "true" />
</RelativeLayout>3) Atualize a classe MainActivity.java para que fique conforme mostrado
a seguir.
package com.exercicios.tema3_internal;
import android.app.Activity;import android.view.View;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import android.os.Bundle;import android.widget.Button;import android.widget.EditText;
public class MainActivity extends Activity { private EditText caixaDeTexto;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); caixaDeTexto = (EditText) findViewById(R.id.entrada); Button btGravar = (Button) findViewById(R.id.bt_gravar); Button btAcrescentar = (Button) findViewById(R.id.bt_acrescentar); Button btLimpar = (Button) findViewById(R.id.bt_limpar); Button btMostrar = (Button) findViewById(R.id.bt_mostrar);
btGravar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String str = caixaDeTexto.getText().toString(); try { FileOutputStream arq = openFileOutput("dados.txt", MODE_WORLD_WRITEABLE); OutputStreamWriter gravador = new OutputStreamWriter(arq); gravador.write(str); gravador.flush();
gravador.close(); caixaDeTexto.setText(""); } catch (IOException ex) { ex.printStackTrace(); } } }); btAcrescentar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String str = caixaDeTexto.getText().toString(); try { FileOutputStream arq = openFileOutput("arquivo.txt", MODE_APPEND); OutputStreamWriter gravador = new OutputStreamWriter(arq); gravador.write(str); gravador.flush(); gravador.close(); caixaDeTexto.setText(""); } catch (IOException ex) { ex.printStackTrace(); } } }); btLimpar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { FileOutputStream arq = openFileOutput("dados.txt", MODE_WORLD_WRITEABLE); OutputStreamWriter gravador = new OutputStreamWriter(arq); gravador.write(""); gravador.flush(); gravador.close(); caixaDeTexto.setText(""); } catch (IOException ex) { ex.printStackTrace(); } } }); btMostrar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { FileInputStream arq = openFileInput("dados.txt"); InputStreamReader leitor = new InputStreamReader(arq); char[] entrada = new char[100]; String saida = ""; int c; while ((c = leitor.read(entrada))>0)
{ String cadeia = String.copyValueOf(entrada, 0, c); saida = saida + cadeia; entrada = new char[100]; } caixaDeTexto.setText(s); } catch (IOException ex) { ex.printStackTrace(); } } }); } }
6) Altere o conteúdo do arquivo strings.xml (em res/value) acrescentando as linhas a seguir.
<string name="lb_orientacao">Digite um texto qualquer:</string><string name="bt_gravar">Gravar</string><string name="bt_acrescentar">Acrescentar</string><string name="bt_limpar">Limpar</string><string name="bt_mostrar">Mostrar</string>
Ao executar a aplicação será mostrada uma tela como esta:
3)Usando gravação externa ( external storage )
Além de gravar dados na memória interna de um dispositivo móvel,
podemos armazená-los, externamente, com em cartões SD.
Para isso, Environment que, através do método
getExternalStorageDirectory() fornece o caminho completo do
armazenamento externo.
A seguir, temos o exemplo de uma aplicação que consegue gravar e ler
dados armazenados de um arquivo gravado em memória externa.
Neste exemplo temos uma aplicação que disponibiliza botões para Gravar
dados em memória externa (apagando o que eventualmente já estiver
gravado) e Mostrar dados gravados na memória externa.
1) Criar um novo projeto android (no exemplo o projeto se chama
Tema3_external, com pacote com.exercicios.tema3_external).
2) Atualize o arquivo activity_main.xml (em res/layout) para que fique
conforme mostrado a seguir:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.exercicios.tema3_external.MainActivity" >
<TextViewandroid:id = "@+id/orientacao"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text="@string/lb_orientacao"android:layout_centerHorizontal = "true" />
<EditTextandroid:id="@+id/entrada" android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below = "@id/orientacao"android:layout_centerHorizontal = "true" />
<Buttonandroid:id = "@+id/bt_gravar"android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="@string/bt_gravar" android:layout_below = "@id/entrada"
android:layout_centerHorizontal = "true" />
<Buttonandroid:id = "@+id/bt_mostrar"android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="@string/bt_mostrar" android:layout_below = "@id/bt_gravar"android:layout_centerHorizontal = "true" />
</RelativeLayout>
3) Atualize a classe MainActivity.java para que fique conforme mostrado
a seguir.
package com.exercicios.tema3_external;
import android.app.Activity;import android.view.View;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import android.os.Bundle;import android.os.Environment;import android.widget.Button;import android.widget.EditText;
public class MainActivity extends Activity { private EditText caixaDeTexto;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); caixaDeTexto = (EditText) findViewById(R.id.entrada); Button btGravar = (Button) findViewById(R.id.bt_gravar); Button btMostrar = (Button) findViewById(R.id.bt_mostrar); btGravar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String str = caixaDeTexto.getText().toString(); try { File sdCard = Environment.getExternalStorageDirectory(); File directory = new File (sdCard.getAbsolutePath() + "/arquivos"); directory.mkdirs(); File arq = new File(directory, "dados.txt"); FileOutputStream streamOut = new FileOutputStream(arq); OutputStreamWriter gravador = new OutputStreamWriter(streamOut); gravador.write(str); gravador.flush();
gravador.close(); caixaDeTexto.setText(""); } catch (IOException ex) { ex.printStackTrace(); } } }); btMostrar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { File sdCard = Environment.getExternalStorageDirectory(); File directory = new File (sdCard.getAbsolutePath() + "/arquivos"); File arq = new File(directory, "dados.txt"); FileInputStream streamIn = new FileInputStream(arq); InputStreamReader leitor = new InputStreamReader(streamIn); char[] entrada = new char[100]; String saida = ""; int c; while ((c = leitor.read(entrada))>0) { String cadeia = String.copyValueOf(entrada, 0, c); saida = saida + cadeia; entrada = new char[100]; } caixaDeTexto.setText(saida); leitor.close(); } catch (IOException ex) { ex.printStackTrace(); } } }); } }
6) Altere o conteúdo do arquivo strings.xml (em res/value) acrescentando as linhas a seguir.
<string name="lb_orientacao">Digite um texto qualquer:</string><string name="bt_gravar">Gravar</string><string name="bt_mostrar">Mostrar</string>
7) Altere o conteúdo do arquivo Androidmanifest.xml para que fique assim:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.exercicios.tema3_external" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> </uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>
Ao executar a aplicação será mostrada uma tela como esta:
4)Usando BD SQLite
Permite que a aplicação trabalhe com um conjunto de dados relacionais. O
BD criado para o aplicativo ficará restrito ao seu próprio uso, não sendo
visível para outras aplicações.
O Android fornece suporte nativo ao sistema de banco de dados SQLite, que
é bastante simples e consome poucos recursos.
Para um projeto trabalhar com SQLite, é necessário:
a) Criação de uma classe que estenda a classe SQLiteOpenHelper
Nesta classe deverá fornecer implementações que sobreponham os
métodos herdados:
onCreate() que cria a base de dados quando a aplicação é
instalada.
onUpdade() que atualiza a base de dados para novas versões.
A classe SQLiteOpenHelper também oferece dois métodos
responsáveis por obter uma instância do banco de dados com o qual
se deseja trabalhar em mode de leitura e de escrita. São eles
getWritableDatabase() e getReadableDatabase().
Além disso, é importante criar métodos responsáveis por acessar o
banco de dados realizando, consultas, inserções, alterações e
remoções.
Glossário:
BD – Bando de dados ou Base de dados.
SQLite – Banco de dados relacional disponibilizado nativamente pelo
android.
Storage – Armazenamento de dados de forma persistente.
Entenda como utilizar gravação utilizando Shared Preferences assistindo ao
vídeo “SharedPreferences no Android, Entendendo e Utilizando”. Disponível
em http://www.thiengo.com.br/sharedpreferences-no-android-entendendo-
e-utilizando
Tempo: 37:05
Analise um exemplo de aplicações realizando persistência de dados com
SharedePreferences e em armazenamento interno lendo “TUTORIAL –
Android – Parte 4 – Persistência de Dados”. Disponível em
http://www.mobiltec.com.br/blog/index.php/tutorial-android-parte-4-
persistencia-de-dados.
Entenda como realizar persistência de dados usando banco de dados SQLite
assistindo ao vídeo “SQLite no Android, Entendendo e Utilizando”.
Disponível em https://www.youtube.com/watch?v=QQ-Ir8pwxWA.
Tempo: 30:36
Instruções:
Questão 1: Considerando o que foi estudado no tema anterior sobre
activity, views, event handlers e event listeners, criar uma aplicação
contendo radio buttom que representem as estações climáticas do ano.
Além disso, a tela deverá mostrar 2 botões: Confirmar e Encerrar.
Ao clicar no botão Confirmar, mostrar a estação do ano escolhida pelo
cliente.
Ao clicar no botão Encerrar, finalizar a execução da aplicação.
A seguir está mostrado layout do que é desejado.
Questão 2: A forma de persistência de dados que permite a gravação de
pares (chave, valor) é:
a) Internal Storage
b) External Storage
c) SharedPreferences
d) Banco de dados SQLite
e) ClosedPreferences
Questão 3: Para se trabalhar com um banco de dados SQLite deve-se
estender uma determinada classe, e nela sobrescrever os métodos
onCreate() e onUpdate(). Assinale a alternativa que contém o nome da
classe que deve ser estendida.
a) SQLiteDataBase
b) SQLiteManager
c) SQLiteNewHelper
d) SQLiteOpenHelper
e) SQLiteInstructions
Questão 4: Neste tema foram estudadas diferentes formas de aplicações
para android persistirem dados. Apresente situações em que o uso da
persistência por SharedPreferences, Internal Storage e External Storage são
indicadas.
Questão 5: Desenvolva uma aplicação que trabalhe com um banco dados
SQLite chamado empresa. Neste banco, criar uma tabela chamada pessoas,
cujas colunas são: código (auto-incremento) e nome (texto não nulo).
A aplicação deve ter uma activity que permita gravar dados de uma pessoa
e mostrar os dados já cadastrados.
A seguir estão apresentado layout do que se deseja.
Finalizando:
Neste tema você estudos conceitos importantíssimos no desenvolvimento
de aplicações para dispositivos móveis utilizando android. A apresentação
de widgets e o tratamento dos eventos decorrentes das ações dos usuários
são itens indispensáveis a qualquer aplicação.
Neste momento é importante destacar que conceitos de programação
orientada a objetos são imprescindíveis, pois permitem ao desenvolvedor
utilizar ao máximo os recursos fornecidos pelo framework.
REFERÊNCIAS
LEE, Wei-Meng, Introdução ao Desenvolvimento de Aplicativos para o Android. 1.ed. Rio de Janeiro: Ciência Moderna, 2011.
CALOPSITA, Thiengo. SharedPreferences no Android, Entendendo e
Utilizando. Disponível em: http://www.thiengo.com.br/sharedpreferences-
no-android-entendendo-e-utilizando. Acesso em: 05 set. 2014.
CALOPSITA, Thiengo. SQLite no Android, Entendendo e Utilizando.
Disponivel em: <https://www.youtube.com/watch?v=QQ-Ir8pwxWA>.
Acesso em: 05 set. 2014.
K19. Desenvolvimento Mobile com Android. Disponível em:
<http://www.k19.com.br/downloads/apostilas/java/k19-k41-
desenvolvimento-mobile-com-android>. Acesso em: 05 set. 2014.
MOBILTEC. TUTORIAL – Android – Parte 4 – Persistência de Dados.
Disponível em: <http://www.mobiltec.com.br/blog/index.php/tutorial-
android-parte-4-persistencia-de-dados/>. Acesso em 05 set. 2014.
GABARITO-
Aula 3: Persistência de dados
Tema 3: Persistência de dados
Questão 1:
1) Criar um novo projeto android (nesta resolução foi criado um projeto
chamado tema3_ex1, no pacote com.exercicios.tema3_ex1).
2) Na pasta res/layout alterar o arquivo activity_main.xml para que
ele fique conforme apresentado a seguir.
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical" > <RadioGroup android:id="@+id/radioEstacoesDoAno" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RadioButton android:id="@+id/radio_primavera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_primavera"/> <RadioButton android:id="@+id/radio_verao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_verao" android:checked="true" />
<RadioButton android:id="@+id/radio_outono" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_outono"/> <RadioButton android:id="@+id/radio_inverno" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_inverno" android:checked="true" /> </RadioGroup> <Button android:id="@+id/bt_confirmar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_confirmar" />
<Button android:id="@+id/bt_fechar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_fechar" /> </LinearLayout>
3) Alterar o conteúdo da classe MainActivity.java para que fique assim:
package com.exercicios.tema3_ex1;
import android.app.Activity;import android.os.Bundle;
import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.Toast;
public class MainActivity extends Activity {
private RadioGroup radioGroupId; private RadioButton radioGenderButton; private Button bt_confirmar; private Button bt_fechar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addButtonListener(); }
public void addButtonListener() {
radioGroupId = (RadioGroup) findViewById(R.id.radioEstacoesDoAno); bt_confirmar = (Button) findViewById(R.id.bt_confirmar); bt_fechar = (Button) findViewById(R.id.bt_fechar); bt_confirmar .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {
int selectedOption = radioGroupId.getCheckedRadioButtonId();
radioGenderButton = (RadioButton) findViewById(selectedOption);
Toast.makeText(MainActivity.this, "Você escolheu " + radioGenderButton.getText(), Toast.LENGTH_SHORT).show(); } });
bt_fechar .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); }}
4) Em res/values alterar o arquivo string.xml acrescentando as linhas a
seguir.
<string name="lb_primavera">Primvera</string> <string name="lb_verao">Verao</string> <string name="lb_outono">Outono</string>
<string name="lb_inverno">Inverno</string> <string name="lb_confirmar">Confirme a escolha</string> <string name="lb_fechar">Encerrar a aplicação</string>
Questão 2:
Alternativa correta: C
Armazenamento de dados no formato de um par (chave, valor) deve ser
feito através de SharedPreferences. Importante salientar que tais dados
gravados através desta estratégia ficarão restritos à aplicação que os criou.
Questão 3:
Alternativa correta: D
SQLiteOpenHelper é uma classe que permite a manipulação de um banco de
dados SQLite. Para ser usada, ela deve ser estendida por alguma outra
classe da aplicação, na qual os métodos onCreate() e onUpdate() serão
sobrepostos.
O método onCreate() é executado para criar um banco de dados. Isto pode
acontecer quando a aplicação for executada pela primeira vez ou nos casos
em que o banco de dados tenha sido eliminado.
Já o método onUpdate() será executado toda vez que houver diferença na
versão do banco. Normalmente existe a necessidade de executar o
onUpadate() quando há atualização de versão da aplicação. Dentro do
método onUpdate() a aplicação pode executar qualquer alteração
necessária no banco de dados.
Questão 4:
Persistência de dados usando ShredPreferences é indicado quando se deseja
armazenar dados que podem ser representados em pares (chave, valor).
Este tipo de dado é interessante quando se deseja gravar configurações do
usuário, como: nome, tema do plano de fundo, tipo de letra, cor de botão,
data do último acesso, etc.
Persistência de dados usando Internal Storage pode ser usada para gravar
dados não estruturados que o usuário tem necessidade de registrar e que
não serão compartilhados por outras aplicações. Pode ser um lembrete,
uma anotação. Não existe uma pré-estruturação dos dados que podem ser
gravados.
Persistência de dados usando External Storage pode ser usada quando
existe a necessidade de compartilhar dados com outros usuários ou outras
aplicações. Nestas situações realizar gravações em um meio externo, como
um cartão SD, pode ser uma excelente estratégia.
Questão 5:
1) Criar um novo projeto android (nesta resolução foi criado um projeto
chamado Tema3_sqlite, no pacote com.exercicios.tema3_sqlite).
2) Alterar o conteúdo do arquivo activity_main.xml (na pasta res/layout)
para que seu conteúdo fique conforme apresentado a seguir.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/lb_nome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lb_nome"> <requestFocus /> </TextView> <EditText android:id="@+id/txt_nome" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" /> <Button android:id="@+id/bt_gravar" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lb_gravar" /> <Button android:id="@+id/bt_mostrar" android:layout_width="match_parent"
android:layout_height="wrap_content" android:text="@string/lb_mostrar" /></LinearLayout>
3) Em res/values, alterar o arquivo string.xml acrescentando as linhas a
seguir.
<string name="lb_gravar">Gravar</string> <string name="lb_mostrar">Mostrar</string> <string name="lb_nome">Digite um nome: </string>
4) Alterar o conteúdo da classe MainActivity.java, deixando-o conforme
apresentado a seguir.
package com.exercicios.tema3_sqlite;
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import android.database.Cursor;
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final AcessoBanco db = new AcessoBanco(this); final EditText txtNome=(EditText)findViewById(R.id.txt_nome); Button btGravar = (Button) findViewById(R.id.bt_gravar); Button btMostrar = (Button) findViewById(R.id.bt_mostrar); btGravar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String novoNome = txtNome.getText().toString(); db.open(); db.inserePessoa(novoNome); db.close(); txtNome.setText(""); mostraRegistro("Inserção realizada com sucesso. "); } }); btMostrar.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { db.open(); Cursor c = db.getCadastros(); if (c.moveToFirst()) { do { mostraRegistro(c);
} while (c.moveToNext()); } db.close(); } });} public void mostraRegistro(Cursor c) { Toast.makeText(this, "Codigo: " + c.getString(0) + "\n" + "Nome: " + c.getString(1) + "\n", Toast.LENGTH_SHORT).show(); } public void mostraRegistro(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }
5) Criar uma classe chamada Conexao.java, com o conteúdo mostrado a
seguir.
package com.exercicios.tema3_sqlite;
import android.content.Context;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;
public class Conexao extends SQLiteOpenHelper { private static final String TAG = "DBAdapter"; private static final String NOME_BD = "empresa"; private static final int DATABASE_VERSION = 2; private static final String DATABASE_CREATE = "create table pessoas (codigo integer primary key autoincrement, nome text not null);";
Conexao(Context context) { super(context, NOME_BD, null, DATABASE_VERSION); }
@Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); } catch (SQLException e) { e.printStackTrace(); } }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Atualizando banco de dados da versão " + oldVersion + " para " + newVersion + ". Todos os dados serão destruidos."); db.execSQL("DROP TABLE IF EXISTS pessoas"); onCreate(db); }}
6) Criar uma classe chamada AcessoBanco.java, com o conteúdo
mostrado a seguir.
package com.exercicios.tema3_sqlite;
import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;
public class AcessoBanco { public static final String CODIGO = "codigo"; public static final String NOME = "nome"; private static final String NOME_BD = "empresa"; private static final String NOME_TABELA = "pessoas"; private final Context context; private Conexao conector; private SQLiteDatabase db;
public AcessoBanco(Context ctx) { this.context = ctx; conector = new Conexao(context); }
public AcessoBanco open() throws SQLException { db = conector.getWritableDatabase(); return this; }
public void close() { conector.close(); } public long inserePessoa(String name) { ContentValues initialValues = new ContentValues(); initialValues.put(NOME, name); return db.insert(NOME_TABELA, null, initialValues); }
public boolean remmovePessoa(long cod) { return db.delete(NOME_TABELA,CODIGO+"="+cod, null) > 0; }
public Cursor getCadastros() { return db.query(NOME_TABELA, new String[] {CODIGO, NOME}, null, null, null, null, null); }
public Cursor getPessoa(long cod) throws SQLException { Cursor mCursor = db.query(true, NOME_TABELA, new String[] {CODIGO, NOME}, CODIGO + "=" + cod, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; }
public boolean updatePessoa(long cod, String name, String email) { ContentValues args = new ContentValues(); args.put(NOME, name); return db.update(NOME_BD, args, CODIGO + "=" + cod, null) > 0; }}