Você está na página 1de 12

PROGRAMAÇÃO

ANDROID
Salvando imagens no banco

Universidade Federal de Sergipe


Departamento de Sistemas de Informação
Prof. Andrés Menéndez
ammenendez@gmail.com
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) {


this.id = id;
this.nome = nome;
this.foto = 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();


imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte imagemBytes[] = stream.toByteArray();

• 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 = bd.getContato(id);

byte[] outImage=contato.getFoto();
ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);
imagem.setImageBitmap(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) {


this.nome = nome;
}

public byte[] getFoto() {


return foto;
}

public void setFoto(byte[] foto) {


this.foto = foto;
}
}
Armazenando com Realm
• Vejamos a programação do botão Tirar Foto

imagem = (ImageView) findViewById(R.id.imFotos);


Button foto = (Button) findViewById(R.id.btnFotos);
foto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent takePictureIntent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(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) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TIRAR_FOTO && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
imagem.setImageBitmap(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();
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte imagemBytes[] = stream.toByteArray();

Realm realm = Realm.getDefaultInstance();


realm.beginTransaction();
Contato contato = new Contato();
contato.setNome(nome.getText().toString());
contato.setFoto(imagemBytes);
realm.copyToRealm(contato);
realm.commitTransaction();
realm.close();
Toast.makeText(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 = Realm.getDefaultInstance();

Contato contato = realm.where(Contato.class).equalTo("nome",


nome.getText().toString()).findFirst();
if (contato != null) {
byte[] outImage=contato.getFoto();
ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);
imagem.setImageBitmap(imageBitmap);
}
realm.close();
}

Você também pode gostar