aula08-persistência de dados.ppt

22
Persistência de Dados Persistência de Dados Edilson Mendes Bizerra Edilson Mendes Bizerra Junior Junior edilson.junior@fafica- edilson.junior@fafica- pe.edu.br pe.edu.br

Upload: jesse-bezerra

Post on 27-Dec-2015

33 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Aula08-Persistência de Dados.ppt

Persistência de DadosPersistência de Dados

Edilson Mendes Bizerra JuniorEdilson Mendes Bizerra [email protected]@fafica-pe.edu.br

Page 2: Aula08-Persistência de Dados.ppt

Roteiro de Aula

Persistência de Dados Shared Preferences SQLite

Criação do Banco de Dados Classes SQLiteOpenHelper, SQLiteDatabase e ContentValues Inserção, Atualização, Exclusão e Busca de registro no Banco

de Dados Classe Cursor

Referências

Page 3: Aula08-Persistência de Dados.ppt

Persistência de Dados

Aplicações em geral necessitam persistir dados. O Android oferece as seguintes opções: SharedPreferences: persistência de dados primitivos

em pares chave-valor Armazenamento interno: persistência de dados na

memória interna do dispositivo Armazenamento externo: persistência de dados em

âmbito externo ao dispositivo (p. ex. no cartão de memória)

Bases de dados SQLite: persistência de dados estruturados em uma base de dados privada

Page 4: Aula08-Persistência de Dados.ppt

SharedPreferences

Os dados são salvos em /data/data/nome_pacote/shared_prefs

Não podem ser recuperados por outras aplicações 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", "Programação Disp. móveis");editor.putInt("nota", 10);editor.commit();

SharedPreferences prefs = getSharedPreferences("preferencias", Context.MODE_PRIVATE);Editor editor = prefs.edit();editor.putString("disciplina", "Programação Disp. móveis");editor.putInt("nota", 10);editor.commit();

Page 5: Aula08-Persistência de Dados.ppt

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 parâmetro indica o valor default que deve ser

retornado caso a chave não exista

SharedPreferences prefs = getSharedPreferences("preferencias", Context.MODE_PRIVATE);String disciplina = prefs.getString("disciplina", "");int nota = prefs.getInt("nota", 0);

SharedPreferences prefs = getSharedPreferences("preferencias", Context.MODE_PRIVATE);String disciplina = prefs.getString("disciplina", "");int nota = prefs.getInt("nota", 0);

Page 6: Aula08-Persistência de Dados.ppt

SharedPreferences

Removendo uma chave específica 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.remove("disciplina");editor.commit();

SharedPreferences prefs = getSharedPreferences("preferencias", Context.MODE_PRIVATE);Editor editor = prefs.edit();editor.clear();editor.commit();

SharedPreferences prefs = getSharedPreferences("preferencias", Context.MODE_PRIVATE);Editor editor = prefs.edit();editor.clear();editor.commit();

Page 7: Aula08-Persistência de Dados.ppt

SQLite

O Android tem integração nativa com o SQLite (www.sqlite.org), um leve e poderoso banco de dados

Cada aplicação pode criar um ou mais bancos de dados, que ficam localizados em: /data/data/nome_pacote/databases

O banco de dados só é visível para a aplicação que o criou

Page 8: Aula08-Persistência de Dados.ppt

Criação do Banco de Dados

API do Android (executar SQL) Adotado aqui pois permite criar pela aplicação

Cliente gráfico 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, após criar, é preciso mover o arquivo para a pasta /data/data/<pacote>/databases do emulator

Page 9: Aula08-Persistência de Dados.ppt

Criação de um Banco de Dados usando a API Para criar e atualizar uma base de dados em uma aplicação

Android, é recomendado criar uma subclasse de SQLiteOpenHelper e deve se implementar os métodos:‐ onCreate(), que é chamado pelo Framework Android para

execução dos comandos SQL para criar a base de dados onUpgrade(), que é chamado quando a versão da base de dados é

incrementada na aplicação, permitindo executar os comandos SQL necessários para atualização do esquema da mesma

A classe SQLiteOpenHelper fornece os métodos getReadableDatabase() e getWritableDatabase() para obter acesso ao objeto SQLiteDatabase – para leitura ou escrita, respectivamente

Page 10: Aula08-Persistência de Dados.ppt
Page 11: Aula08-Persistência de Dados.ppt

Classe SQLiteOpenHelper

Auxilia abertura e criação 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, não existe.

void onOpen(SQLiteDatabase db) Chamado quando o banco de dados é aberto.

void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

Chamado quando a versão do banco de dados sendo aberto é diferente da versão existente.

Page 12: Aula08-Persistência de Dados.ppt

Classe SQLiteDatabase

SQLiteDatabase é a classe base para trabalhar com o SQLite no Android e fornece métodos para abrir, consultar, atualizar e fechar a base de dados

static SQLiteDatabaseopenDatabase(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 não seja SELECT. Exemplo: CREATE TABLE, INSERT, UPDATE, etc.

Page 13: Aula08-Persistência de Dados.ppt

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>

Page 14: Aula08-Persistência de Dados.ppt

Inserção de registros no banco de dadosContentValues values = new ContentValues();values.put("nome", "Marcos");values.put("telefone", "98765432");SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();db.insert("contatos", null, values)// O código anterior equivale ao seguinte SQL// insert into table contatos(nome,telefone) values (“Marcos”,“98765432”);

ContentValues values = new ContentValues();values.put("nome", "Marcos");values.put("telefone", "98765432");SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();db.insert("contatos", null, values)// O código anterior equivale ao seguinte SQL// insert into table contatos(nome,telefone) values (“Marcos”,“98765432”);

Parâmetro Descrição

String tabela Nome da Tabela

String nullColumnHack Nome de uma coluna opcional usada para não 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)

Page 15: Aula08-Persistência de Dados.ppt

Classe ContentValues

ContentValues Permite definir pares chave-valor, onde a chave

representa o identificador da coluna na tabela e o valor representa o conteúdo dessa coluna

Equivalente a um HashMap put(String key, valor)

Page 16: Aula08-Persistência de Dados.ppt

Atualização de registros no banco de dados

Parâmetro Descrição

String tabela Nome da Tabela

ContentValues valores

Estrutura de chave e valores, com os valores para atualização

String where String com a cláusula where utilizada para identificar o registro. Pode ser uma string com o texto “_id=1”, ou uma string com o texto “_id=?”, tornando necessário usar o último argumento para informar o valor do “?”

String whereArgs

Array com os parâmetros necessários, caso a cláusula where defina algum parâmetro 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;

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;

Page 17: Aula08-Persistência de Dados.ppt

Exclusão de registros no banco de dados

Parâmetro Descrição

String tabela Nome da Tabela

String where String com a cláusula where utilizada para identificar o registro. Pode ser uma string com o texto “_id=1”, ou uma string com o texto “_id=?”, tornando necessário usar o último argumento para informar o valor do “?”

String whereArgs Array com os parâmetros necessários, caso a cláusula where defina algum parâmetro 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;

SQLiteDatabase db = new DatabaseHandler(context).getWritableDatabase();db.delete("contatos", "_id=?", new String[]{"1"});// Idem a: delete from contatos where _id=1;

Page 18: Aula08-Persistência de Dados.ppt

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 encontrouif(c.getCount() > 0) { // Posiciona no primeiro resultado c.moveToFirst();

// Utiliza os métodos 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...”

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 encontrouif(c.getCount() > 0) { // Posiciona no primeiro resultado c.moveToFirst();

// Utiliza os métodos 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...”

Page 19: Aula08-Persistência de Dados.ppt

Busca de registros no banco de dados

Parâmetro Descrição

boolean distinct Usado para que o resultado não contenha registros duplicados. É opcional e existe uma assinatura deste método sem ele.

String tabela Nome da Tabela

String[] colunas Array com os nomes das colunas para seleção. Passar o valor null retorna todas as colunas

String selecao Cláusula where utilizada para filtrar os registros. Passar os null retorna todos os registros

String[] selecaoArgs Argumentos “?” da cláusula where, caso necessário

String groupBy Nome das colunas para agrupar (group by). Passar null não agrupará registros

String having Filtros para os grupos criados, quando houverem

String orderBy Nome das colunas para ordenar (order by)

String limit Limita o número de registros retornados pela consulta

SQLiteDatabase.query(distinct, tabela, colunas, seleção, seleçãoArgs, groupBy, having, orderBy, limit)

Page 20: Aula08-Persistência de Dados.ppt

Classe Cursor

Uma consulta à base de dados retorna o objeto Cursor, que basicamente aponta para um registro do resultado da consulta

O método int getCount() retorna o número de registros resultantes da consulta

Para se mover entre os registros utiliza se os métodos ‐ boolean moveToFirst() e boolean moveToNext() O método boolean isAfterLast() permite checar se não existem mais

resultados da consulta O Cursor contém métodos para obter os conteúdos das colunas

resultantes como String getString(int columnIndex) e long getLong(int columnIndex) onde se passa o número da coluna desejada por parâmetro O método int getColumnIndex(String columnName) pode ser usado para

tentar recuperar o índice da coluna a partir de seu nome, ou -1 caso a coluna não existe

Page 21: Aula08-Persistência de Dados.ppt

Dúvidas

Page 22: Aula08-Persistência de Dados.ppt

Referências