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