PROGRAMAÇÃO
ANDROID
Salvando imagens no banco
Universidade Federal de Sergipe
Departamento de Sistemas de Informação
Prof. Andrés Menéndez
ammenendez@[Link]
Guardando as imagens no SQLite
• Para armazenar as imagens em um banco de dados
SQLite temos que usar um tipo de dados chamado BLOB
• O tipo BLOB é um array de bytes e, portanto, algumas
transformações são necessárias
• Suponha que nossa tabela é da seguinte forma
CREATE TABLE Contatos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome CHAR (20),
foto BLOB
);
Guardando as imagens no SQLite
• A classe que vai representar a tabela poderia ser assim
public class Contato {
private int id;
private String nome;
private byte[] foto;
public Contato(int id, String nome, byte[] foto) {
[Link] = id;
[Link] = nome;
[Link] = foto;
}
// métodos get e set
}
Guardando as imagens no SQLite
• Na inserção do elemento temos que transformar o BitMap
num byte[ ] (array de bytes)
• Fazemos com o seguinte código
ByteArrayOutputStream stream = new ByteArrayOutputStream();
[Link]([Link], 100, stream);
byte imagemBytes[] = [Link]();
• Onde imageBitmap é a imagem que quer ser enviada no
formato BitMap
Guardando as imagens no SQLite
• Imaginando que fizemos uma consulta ao banco de
dados, a transformação para mostrar a imagem pode ser
vista abaixo
// consulta ao banco de dados
DataBaseHandler bd = new DataBaseHandler(this);
Contato contato = [Link](id);
byte[] outImage=[Link]();
ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
Bitmap imageBitmap = [Link](imageStream);
[Link](imageBitmap);
Armazenando com Realm
• Neste caso depois de fazer a configuração da aplicação
para usar o Realm vamos fazer ter que usar também um
array de bytes para representar a foto
Armazenando com Realm
• O app vai ter o seguinte
formato
• Ele vai permitir que sejam
tiradas e armazenadas fotos
além de fazer a pesquisa pelo
nome do contato
Armazenando com Realm
• A classe que vai ser persistida pode ser vista abaixo
public class Contato extends RealmObject {
private String nome;
private byte[] foto;
public String getNome() {
return nome;
}
public void setNome(String nome) {
[Link] = nome;
}
public byte[] getFoto() {
return foto;
}
public void setFoto(byte[] foto) {
[Link] = foto;
}
}
Armazenando com Realm
• Vejamos a programação do botão Tirar Foto
imagem = (ImageView) findViewById([Link]);
Button foto = (Button) findViewById([Link]);
[Link](new [Link]() {
@Override
public void onClick(View v) {
Intent takePictureIntent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if ([Link](getPackageManager()) != null) {
startActivityForResult(takePictureIntent, TIRAR_FOTO);
}
}
});
Armazenando com Realm
• O retorno da chamada da câmera pode ser visto no
método abaixo
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
[Link](requestCode, resultCode, data);
if (requestCode == TIRAR_FOTO && resultCode == RESULT_OK) {
Bundle extras = [Link]();
imageBitmap = (Bitmap) [Link]("data");
[Link](imageBitmap);
}
}
• Tanto imageBitmap (Bitmap) quanto imagem (ImageView)
são atributos da classe
Armazenando com Realm
• Vejamos como fica a programação do botão salvar
@Override
public void onClick(View v) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
[Link]([Link], 100, stream);
byte imagemBytes[] = [Link]();
Realm realm = [Link]();
[Link]();
Contato contato = new Contato();
[Link]([Link]().toString());
[Link](imagemBytes);
[Link](contato);
[Link]();
[Link]();
[Link](getApplicationContext(), "Foto armazenada com sucesso",
Toast.LENGTH_LONG).show();
}
Armazenando com Realm
• Vejamos agora como fazer a consulta pelo nome do
contato
public void onClick(View v) {
Realm realm = [Link]();
Contato contato = [Link]([Link]).equalTo("nome",
[Link]().toString()).findFirst();
if (contato != null) {
byte[] outImage=[Link]();
ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
Bitmap imageBitmap = [Link](imageStream);
[Link](imageBitmap);
}
[Link]();
}