O android provê algumas funcionalidades avançadas e extremamente úteis para a persistência de arquivos e imagens, entretanto, em alguns casos pode ser mais fácil salvar estes arquivos ou imagens diretamente no banco de dados SQL. Este post explica um pouco sobre como pode ser feita a persistência e recuperação de uma imagem diretamente no banco de dados.
Para este exemplo, utilizaremos uma imagem baixada da internet e a salvaremos diretamente no SQLite, no nosso mesmo modelo anterior, o “Usuario”. A estrutura de criação e acesso ao banco deve ser feita como demonstrada no post anterior “Database no Android – Parte 1”, e por isso, neste exemplo apenas demonstrarei os métodos de inserção e recuperação da imagem.
OBS.: Este post cobre apenas o tratamento de imagens diretamente no banco de dados, assume-se que o desenvolvedor tenha conhecimento de outros fundamentos básicos, demonstrados em posts de introdução anteriores.
[cc lang=”java” width=”100%”]
public Usuario criaUsuarioComFoto(String nome, String url_foto)
throws IOException {
// Cria a url da qual baixaremos a foto do usuario
URL url = new URL(url_foto);
// Abre uma conexao com a internet
URLConnection urlConnection = url.openConnection();
// Realiza o download da imagem e converte para um BufferedInputStream,
// que sera transformado em um byteArray
InputStream inputStream = urlConnection.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(
inputStream, 128);
// Cria um novo byteArray e realiza a leitura dos bytes do
// BufferedInputStream, para a criacao do mesmo, que sera salvo no banco
ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(128);
int current = 0;
while ((current = bufferedInputStream.read()) != -1) {
byteArrayBuffer.append((byte) current);
}
// Assim como no exemplo anterior, utilizamos a SQLiteDatabase para
// realizar o insert dos valores no banco de dados. Neste caso, salvamos
// o array de bytes que representa a imagem em um campo texto
ContentValues values = new ContentValues();
values.put(UsuarioSQLiteHelper.COLUNA_NOME, nome);
values.put(UsuarioSQLiteHelper.COLUNA_FOTO,
byteArrayBuffer.toByteArray());
long usuarioId = database.insert(UsuarioSQLiteHelper.TABELA_USUARIO,
null, values);
return recuperaUsuario(usuarioId);
}
[/cc]
[cc lang=”java” width=”100%”]
public Bitmap recuperaFoto(Long usuarioId) {
// Query que recupera a ‘imagem’ do banco de dados
Cursor cursor = database.query(UsuarioSQLiteHelper.TABELA_USUARIO,
new String[] { UsuarioSQLiteHelper.COLUNA_FOTO },
UsuarioSQLiteHelper.COLUNA_ID + ” = ” + usuarioId, null, null,
null, null);
// Transforma o valor recuperado em um byteArray, que sera convertido em
// um bitmap
// O parametro passado para o método é o index da coluna na tabela.
// Neste caso 2
// pois temos as colunas _id e nome na tabela usuario, estas possuindo
// index 0 e 1, respectivamente
byte[] imageByteArray = cursor.getBlob(2);
// Finaliza o cursor e libera seus recursos.
cursor.close();
// Realiza a conversao do byteArray para um inputStream e em seguida
// decodifica este valor para um bitmap, que será retornado
ByteArrayInputStream imageStream = new ByteArrayInputStream(
imageByteArray);
Bitmap foto = BitmapFactory.decodeStream(imageStream);
return foto;
}
[/cc]
Este foi o segundo post sobre Databases no Android, espero que tenham gostado. Quaisquer dúvidas, sugestões e/ou reclamações, comentem!
_________________________________________
Lucas Oliveira – Analista Programador na redspark.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_
Uma pequena dúvida, o que é passado no “url_foto”?