Armazenamento de dados Opções de Armazenamento Shared Preferences Mecanismo simples de armazenar pares de chavevalor Internal Storage Mecanismo para armazenar dados na memória do aparelho External Storage Mecanismo para armazenar dados em um storage externo (cartões SD, USB, etc.) SQLITE DATABASES SQLite Databases Android oferece um suporte completo para banco de dados SQLite. Banco de dados podem ser criados e acessados por qualquer classe de uma aplicação Mas não podem ser acessados por outras aplicações SQLite é uma biblioteca de software que implementa um engenho de Banco de Dados SQL (self-contained, serverless, zeroconfiguration, transactional) Engenho de banco de dados mais “deployed” do mundo Código fonte de domínio público Patrocinado por: SQLite no Android Nenhum banco de dados padrão é oferecido para sua aplicação pelo Android A própria aplicação precisa criar o banco de dados, tabelas, índices e dados Os banco de dados são acessíveis somente pela aplicação que os criou SQLite no Android Para se criar, evoluir e abrir bancos de dados, a maneira mais recomendada é criar uma subclasse de SQLiteOpenHelper e redefinir: Construtor Método onCreate() Método onUpgrade() Outros métodos opcionais que podem ser redefinidos onOpen() onDowngrade() Construtor de sua classe Helper public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = “meu_bd”; DictionaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } } Nome do banco de dados Contexto do componente Versão do BD Fábrica de cursor SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) onCreate de sua classe Helper public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = “meu_bd”; private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_CREATE = "CREATE TABLE DICTIONARY (" + “KEYWORD TEXT, " + “DEFINITION TEXT);"; DictionaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } } onUpgrade de sua classe Helper @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS DICTIONARY"); onCreate(db); } Como acessar o BD a partir dos componentes (Activity, Services...) package ufrn.aulas; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class HelloBDActivity extends Activity{ private SQLiteDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DatabaseFirstExampleHelper helper = new DatabaseFirstExampleHelper(this); database = helper.getReadableDatabase(); } } Como manipular dados no BD Usa-se execSQL() Método adequado para execução de qualquer SQL que não retorna resultados (INSERT, UPDATE, DELETE) Usa-se os métodos insert(),update(), e delete() Eliminam a necessidade de se trabalhar diretamente com SQL Usando execSQL package ufrn.aulas; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class HelloBDActivity extends Activity{ private SQLiteDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DatabaseFirstExampleHelper helper = new DatabaseFirstExampleHelper(this); database = helper.getWritebleDatabase(); database.execSQL("INSERT INTO DICTIONARY (KEYWORD,DEFINITION) VALUES ('Android','Plataforma para Dispositivos Móveis')"); } } Usando os métodos específicos private void processAdd(DialogWrapper wrapper) { ContentValues values=new ContentValues(2); values.put(DatabaseHelper.TITLE, wrapper.getTitle()); values.put(DatabaseHelper.VALUE, wrapper.getValue()); db.getWritableDatabase().insert("constants", null, values); } private void processDelete(long rowId) { String[] args={String.valueOf(rowId)}; db.getWritableDatabase().delete("constants", "ID=?", args); } Buscando dados no BD Usa-se rawQuery() para executar um SELECT diretamente Usa-se query() Para passar as partes dos elementos da busca Eliminam a necessidade de se trabalhar diretamente com SQL Usando rawQuery() database=db.getReadableDatabase(); constantsCursor = database.rawQuery("SELECT _ID, title, value FROM constants ORDER BY title",null); Usando o método query É preciso passar vários parâmetros, representando as partes da query O nome da tabela A lista das colunas a serem recuperadas A cláusula WHERE (opcionalmente incluindo parâmetros) A lista dos valores para substituir os parâmetros A cláusula GROUP BY A cláusula HAVING A cláusula ORDER BY Usando o método query() String[] columns={"ID", "inventory"}; String[] parms={"snicklefritz"}; Cursor result=db.query("widgets", columns, "name=?", parms, null, null, null); Manipulando cursores Ao executar qualquer query (através dos dois métodos) recebese um cursor como resultado Representa um apontador para os registros resultantes da consulta Com um cursor em mãos pode-se: Recuperar a quantidade de registros retornado, via getCount() Iterar sobre as linhas, via moveToFirst(),moveToNext(), e isAfterLast() Manipular os nomes e posição das colunas do resultado via getColumnNames() e getColumnIndex() Reexecutar a query, via requery() Liberar os recursos via close() Manipulando cursores Cursor result= db.rawQuery("SELECT ID, name, inventory FROM widgets", null); while (!result.moveToNext()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); // Faz algo com os valores } result.close(); FIM