Prezado (a) Autor(a) - badlene.files.wordpress.com · Prezado (a) Autor(a), Inicia-se a produção...

34
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

Transcript of Prezado (a) Autor(a) - badlene.files.wordpress.com · Prezado (a) Autor(a), Inicia-se a produção...

Page 1: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 2: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 3: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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:

Page 4: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 5: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 6: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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 ;

Page 7: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 8: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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>

Page 9: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

<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.

Page 10: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 11: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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" />

Page 12: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

<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();

Page 13: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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)

Page 14: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

{ 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.

Page 15: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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"

Page 16: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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();

Page 17: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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" >

Page 18: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

<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:

Page 19: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 20: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 21: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 22: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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

Page 23: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 24: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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.

Page 25: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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"

Page 26: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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;

Page 27: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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>

Page 28: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

<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

Page 29: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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"

Page 30: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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);

Page 31: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

} 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(); } }

Page 32: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

@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); }

Page 33: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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

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; }}

Page 34: Prezado (a) Autor(a) - badlene.files.wordpress.com · 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