Mobile

Databases em Android – 2

 Android: Persistencia de imagens.

 

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_

 

1 Comments

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: