
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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; } |
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 DClick.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_
Um comentário
Uma pequena dúvida, o que é passado no “url_foto”?
Deixe Seu Comentário