aula08-persistência de dados.ppt
TRANSCRIPT
Persistência de DadosPersistência de Dados
Edilson Mendes Bizerra JuniorEdilson Mendes Bizerra [email protected]@fafica-pe.edu.br
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
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
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();
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);
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();
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
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
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
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.
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.
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>
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)
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)
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;
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;
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...”
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)
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
Dúvidas
Referências