Você está na página 1de 22

Persistncia de Dados

Edilson Mendes Bizerra Junior


edilson.junior@fafica-pe.edu.br
Roteiro de Aula
Persistncia de Dados
Shared Preferences
SQLite
Criao do Banco de Dados
Classes SQLiteOpenHelper, SQLiteDatabase e ContentValues
Insero, Atualizao, Excluso e Busca de registro no Banco
de Dados
Classe Cursor
Referncias

Persistncia de Dados
Aplicaes em geral necessitam persistir dados. O
Android oferece as seguintes opes:
SharedPreferences: persistncia de dados
primitivos em pares chave-valor
Armazenamento interno: persistncia de dados na
memria interna do dispositivo
Armazenamento externo: persistncia de dados em
mbito externo ao dispositivo (p. ex. no carto de
memria)
Bases de dados SQLite: persistncia de dados
estruturados em uma base de dados privada
SharedPreferences
Os dados so salvos em
/data/data/nome_pacote/shared_prefs
No podem ser recuperados por outras aplicaes
Salvando os dados:




Para outros tipos de dados: putBoolean(String key, boolean),
putFloat(String key, float), putInt(String key, int), putLong(String
key, long), putString(String key, String)

SharedPreferences prefs =
getSharedPreferences("preferencias", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.putString("disciplina", "Programao Disp. mveis");
editor.putInt("nota", 10);
editor.commit();
SharedPreferences
Recuperando os dados:




Para outros tipos de dados: boolean getBoolean(String key,
boolean), float getFloat(String key, float), int getInt(String
key, int), long getLong(String key, long), String
getString(String key, String)
*O segundo parmetro indica o valor default que deve ser
retornado caso a chave no exista


SharedPreferences prefs =
getSharedPreferences("preferencias", Context.MODE_PRIVATE);
String disciplina = prefs.getString("disciplina", "");
int nota = prefs.getInt("nota", 0);
SharedPreferences
Removendo uma chave especfica e seu valor:




Removendo todas as chaves e seus valores:


SharedPreferences prefs =
getSharedPreferences("preferencias", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.remove("disciplina");
editor.commit();
SharedPreferences prefs =
getSharedPreferences("preferencias", Context.MODE_PRIVATE);
Editor editor = prefs.edit();
editor.clear();
editor.commit();
SQLite
O Android tem integrao nativa com o SQLite
(www.sqlite.org), um leve e poderoso banco de dados
Cada aplicao pode criar um ou mais bancos de
dados, que ficam localizados em:
/data/data/nome_pacote/databases
O banco de dados s visvel para a aplicao que o
criou
Criao do Banco de Dados
API do Android (executar SQL)
Adotado aqui pois permite criar pela aplicao
Cliente grfico do SQLite
SQLite Expert Personal (gratuito)
http://www.sqliteexpert.com/download.html
Usando SQL via linha de comando (sqlite3 -
<pasta_android>\tools\sqlite3.exe)
Nos 2 ltimos, aps criar, preciso mover o arquivo
para a pasta /data/data/<pacote>/databases do
emulator
Criao de um Banco de Dados
usando a API
Para criar e atualizar uma base de dados em uma aplicao
Android, recomendado criar uma subclasse de
SQLiteOpenHelper e devese implementar os mtodos:
onCreate(), que chamado pelo Framework Android para
execuo dos comandos SQL para criar a base de dados
onUpgrade(), que chamado quando a verso da base de dados
incrementada na aplicao, permitindo executar os comandos SQL
necessrios para atualizao do esquema da mesma
A classe SQLiteOpenHelper fornece os mtodos
getReadableDatabase() e getWritableDatabase() para
obter acesso ao objeto SQLiteDatabase para leitura ou
escrita, respectivamente
Classe SQLiteOpenHelper
Auxilia abertura e criao de um banco de dados

SQLiteOpenHelper(Context, String name,
SQLiteDatabase.CursorFactory,
int version)
Cria um objeto para auxiliar no
gerenciamento da base de dados.
SQLiteDatabase getReadableDatabase() Cria ou abre um banco de dados apenas
para leitura.
SQLiteDatabase getWritableDatabase() Cria ou abre um banco de dados para
leitura e escrita.
void onCreate(SQLiteDatabase db) Chamado quando o banco de dados
precisa ser criado, ou seja, no existe.
void onOpen(SQLiteDatabase db) Chamado quando o banco de dados
aberto.
void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion)
Chamado quando a verso do banco de
dados sendo aberto diferente da
verso existente.
Classe SQLiteDatabase
SQLiteDatabase a classe base para trabalhar com o SQLite no
Android e fornece mtodos para abrir, consultar, atualizar e fechar a
base de dados
static SQLiteDatabase
openDatabase(String path,
CursorFactory factory,
flags)
Abre banco de dados de acordo com os flags:
OPEN_READWRITE, OPEN_READONLY,
CREATE_IF_NECESSARY,
NO_LOCALIZED_COLLATORS.
boolean isOpen() Verifica se est aberto
void close() Fecha banco de dados
void execSQL(String sql) Executa script SQL que no seja SELECT.
Exemplo: CREATE TABLE, INSERT, UPDATE,
etc.
Classe SQLiteDatabase
Cursor query(String table, String[] columns,
String selection, String[] selectionArgs,
String groupBy, String having,
String orderBy)
Cursor query(table, columns, selection,
selectionArgs, groupBy, having,
orderBy, limit)
Cursor query(boolean distinct, table, columns,
selection, selectionArgs, groupBy,
having, orderBy, String limit)
Mostra e executa um SQL de consulta na forma:

SELECT <distinct> <columns>
FROM <table>
WHERE <selection+selectionArgs>
GROUP BY <groupBy>
HAVING <having>
ORDER BY <orderBy>
LIMIT <limit>
long insert(table, nullColumnHack,
ContentValues values)
Insere um registro e retorna o id.
INSERT INTO <table> (values) VALUES (values)
int update(table, ContentValues values,
whereClause, whereArgs)
Altera registro(s) e retorna quantidade de
linhas modificadas.
UPDATE <table> SET <values>
WHERE <whereClause+whereArgs>
int delete(table, whereClause, whereArgs) Deleta registro(s) e retorna quantidade de
linhas modificadas.
DELETE FROM <table>
WHERE <whereClause+whereArgs>
Insero de registros no banco de
dados
ContentValues values = new ContentValues();
values.put("nome", "Marcos");
values.put("telefone", "98765432");
SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();
db.insert("contatos", null, values)
// O cdigo anterior equivale ao seguinte SQL
// insert into table contatos(nome,telefone) values
(Marcos,98765432);





Parmetro Descrio
String tabela Nome da Tabela
String nullColumnHack Nome de uma coluna opcional usada para no permitir
que um registro completamente nulo seja inserido.
ContentValues valores Estrutura de chave e valores, com os valores para
inserir
SQLiteDatabase.insert(tabela, nullColumnHack, valores)
Classe ContentValues
ContentValues
Permite definir pares chave-valor, onde a chave
representa o identificador da coluna na tabela e
o valor representa o contedo dessa coluna
Equivalente a um HashMap
put(String key, valor)

Atualizao de registros no banco de
dados
Parmetro Descrio
String tabela Nome da Tabela
ContentValue
s valores
Estrutura de chave e valores, com os valores para atualizao
String where String com a clusula where utilizada para identificar o registro. Pode
ser uma string com o texto _id=1, ou uma string com o texto _id=?,
tornando necessrio usar o ltimo argumento para informar o valor
do ?
String
whereArgs
Array com os parmetros necessrios, caso a clusula where defina
algum parmetro com ?
SQLiteDatabase.update(tabela, valores, where, whereArgs)
ContentValues values = new ContentValues();
values.put("nome", "Marcos da Silva");
values.put("telefone", "99999999");
SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();
db.update("contatos", values, "_id=?", new String[]{"1"});
// update contatos set nome=Marcos ..., telefone=... where _id=1;

Excluso de registros no banco de
dados
Parmetro Descrio
String tabela Nome da Tabela
String where String com a clusula where utilizada para identificar o
registro. Pode ser uma string com o texto _id=1, ou uma
string com o texto _id=?, tornando necessrio usar o ltimo
argumento para informar o valor do ?
String whereArgs Array com os parmetros necessrios, caso a clusula where
defina algum parmetro com ?
SQLiteDatabase.delete(tabela, where, whereArgs)
SQLiteDatabase db = new
DatabaseHandler(context).getWritableDatabase();
db.delete("contatos", "_id=?", new String[]{"1"});
// Idem a: delete from contatos where _id=1;

Busca de registros no banco de
dados
SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();
Cursor c = db.query("contatos", new String[]{"_id", "nome",
"telefone"}, "nome=?, new String[]{"Marcos Silva"}, null, null, null);
// Se encontrou
if(c.getCount() > 0) {
// Posiciona no primeiro resultado
c.moveToFirst();

// Utiliza os mtodos getLong(ndice), getString(ndice), etc para
// recuperar os valores
long id = c.getLong(0);
String nome = c.getString(1);

Contato contato = new Contato();
contato.setId(id);
contato.setNome(nome);
}
// Idem a: SELECT _id, nome, telefone from contatos where
nome=Marcos...
Busca de registros no banco de
dados
Parmetro Descrio
boolean distinct Usado para que o resultado no contenha registros duplicados.
opcional e existe uma assinatura deste mtodo sem ele.
String tabela Nome da Tabela
String[] colunas Array com os nomes das colunas para seleo. Passar o valor null
retorna todas as colunas
String selecao Clusula where utilizada para filtrar os registros. Passar os null
retorna todos os registros
String[] selecaoArgs Argumentos ? da clusula where, caso necessrio
String groupBy Nome das colunas para agrupar (group by). Passar null no agrupar
registros
String having Filtros para os grupos criados, quando houverem
String orderBy Nome das colunas para ordenar (order by)
String limit Limita o nmero de registros retornados pela consulta
SQLiteDatabase.query(distinct, tabela, colunas, seleo, seleoArgs, groupBy,
having, orderBy, limit)
Classe Cursor
Uma consulta base de dados retorna o objeto Cursor, que
basicamente aponta para um registro do resultado da consulta
O mtodo int getCount() retorna o nmero de registros resultantes
da consulta
Para se mover entre os registros utilizase os mtodos boolean
moveToFirst() e boolean moveToNext()
O mtodo boolean isAfterLast() permite checar se no existem mais
resultados da consulta
O Cursor contm mtodos para obter os contedos das colunas
resultantes como String getString(int columnIndex) e long
getLong(int columnIndex) onde se passa o nmero da coluna
desejada por parmetro
O mtodo int getColumnIndex(String columnName) pode ser usado
para tentar recuperar o ndice da coluna a partir de seu nome, ou -1 caso a
coluna no existe
Dvidas
Referncias

Você também pode gostar