Resumo : este tutorial mostra passo a passo como atualizar e selecionar o BLOB de um banco de dados SQLite.
Para a demonstração usaremos a materials
tabela que criamos no tutorial de criação de tabela .
Suponha que tenhamos que armazenar uma imagem para cada material da materials
tabela. Para fazer isso, adicionamos à tabela uma coluna cujo tipo de dadosmaterials
é BLOB .
A ALTER TABLE
instrução a seguir adiciona a picture
coluna à materials
tabela.
ALTER TABLE materials ADD COLUMN picture blob;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Insira dados BLOB no banco de dados SQLite
Primeiro, consulte os dados da materials
tabela para visualizar seu conteúdo:
SELECT
id,
description,
picture
FROM
materials;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A coluna da imagem é NULL
.
Segundo, prepare um arquivo de imagem e coloque-o em uma pasta, por exemplo, C:\temp, como segue:
Para atualizar a picture
coluna com os dados do arquivo de imagem:
- Primeiro, prepare uma instrução UPDATE .
- Em seguida, conecte-se ao banco de dados SQLite para obter o
Connection
objeto. - Em seguida, crie um
PreparedStatement
objeto a partir doConnection
objeto. - Depois disso, forneça os valores aos parâmetros correspondentes usando os métodos set* do
PreparedStatement
objeto. - Finalmente, execute a
UPDATE
instrução chamando oexecuteUpdate()
método doPreparedStatement
objeto.
Observe que o driver SQLiteJDBC não implementa o setBinaryStream()
método, portanto, você deve usar o setBytes
método.
O readFile
método a seguir lê um arquivo e retorna um array de bytes que podemos passar para o setBytes
método.
/**
* Read the file and returns the byte array
* @param file
* @return the bytes of the file
*/
private byte[] readFile(String file) {
ByteArrayOutputStream bos = null;
try {
File f = new File(file);
FileInputStream fis = new FileInputStream(f);
byte[] buffer = new byte[1024];
bos = new ByteArrayOutputStream();
for (int len; (len = fis.read(buffer)) != -1;) {
bos.write(buffer, 0, len);
}
} catch (FileNotFoundException e) {
System.err.println(e.getMessage());
} catch (IOException e2) {
System.err.println(e2.getMessage());
}
return bos != null ? bos.toByteArray() : null;
}
Linguagem de código: Java ( java )
Para se conectar ao test.db
banco de dados, você usa o connect()
método a seguir:
/**
* Connect to the test.db database
*
* @return the Connection object
*/
private Connection connect() {
// SQLite connection string
String url = "jdbc:sqlite:C://sqlite/db/test.db";
Connection conn = null;
try {
conn = DriverManager.getConnection(url);
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;
}
Linguagem de código: Java ( java )
O updatePicture()
método a seguir atualiza uma imagem especificada pelo nome do arquivo para um material específico.
/**
* Update picture for a specific material
*
* @param materialId
* @param filename
*/
public void updatePicture(int materialId, String filename) {
// update sql
String updateSQL = "UPDATE materials "
+ "SET picture = ? "
+ "WHERE id=?";
try (Connection conn = connect();
PreparedStatement pstmt = conn.prepareStatement(updateSQL)) {
// set parameters
pstmt.setBytes(1, readFile(filename));
pstmt.setInt(2, materialId);
pstmt.executeUpdate();
System.out.println("Stored the file in the BLOB column.");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
Linguagem de código: Java ( java )
Para atualizar a imagem para o ID do material 1, use o seguinte código:
package net.sqlitetutorial;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author tutorials.acervolima.com
*/
public class BLOBApp {
private Connection connect() {
//...
}
private byte[] readFile(String file) {
//...
}
public void updatePicture(int materialId, String filename) {
//...
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
BLOBApp app = new BLOBApp();
app.updatePicture(1, "c:\\temp\\HP_Laptop.jpg");
}
}
Linguagem de código: Java ( java )
Observe que não repetimos o corpo dos métodos que já mencionamos.
Vamos executar o programa e verificar a materials
tabela novamente.
Funciona conforme o esperado.
Consultar dados BLOB do banco de dados SQLite
As etapas a seguir mostram como consultar dados BLOB do banco de dados SQLite:
- Primeiro, prepare uma instrução SELECT .
- A seguir, crie um
Connection
objeto conectando-se ao banco de dados SQLite. - Em seguida, crie uma instância da
PreparedStatement
classe a partir doConnection
objeto. Use o método set* doPreparedStatement
objeto para fornecer valores para os parâmetros. - Depois disso, chame o
executeQuery
método doPreparedStatement
objeto para obtê-ResultSet
lo. - Por fim, percorra o conjunto de resultados, use o
getBinaryStream()
método para obter dados e use oFileOutputStream
objeto para salvar os dados em um arquivo.
O readPicture
método a seguir seleciona os dados BLOB de um material específico e os salva em um arquivo.
/**
* read the picture file and insert into the material master table
*
* @param materialId
* @param filename
*/
public void readPicture(int materialId, String filename) {
// update sql
String selectSQL = "SELECT picture FROM materials WHERE id=?";
ResultSet rs = null;
FileOutputStream fos = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = connect();
pstmt = conn.prepareStatement(selectSQL);
pstmt.setInt(1, materialId);
rs = pstmt.executeQuery();
// write binary stream into file
File file = new File(filename);
fos = new FileOutputStream(file);
System.out.println("Writing BLOB to file " + file.getAbsolutePath());
while (rs.next()) {
InputStream input = rs.getBinaryStream("picture");
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
fos.write(buffer);
}
}
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
if (fos != null) {
fos.close();
}
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
}
}
}
Linguagem de código: Java ( java )
Por exemplo, podemos usar o readPicture()
método para obter os dados BLOB que atualizamos para o ID de material 1 e salvá-los em um arquivo chamado HP_Laptop_From_BLOB.jpg
file.
app.readPicture(1, "c:\\temp\\HP_Laptop_BLOB.jpg");
Linguagem de código: Java ( java )
Executamos o programa e verificamos a c:\\temp
pasta:
Neste tutorial, você aprendeu como atualizar e selecionar dados BLOB no banco de dados SQLite usando o driver SQLite JDBC.