SQLite Java: escrever e ler BLOB

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 materialstabela que criamos no tutorial de criação de tabela .

Suponha que tenhamos que armazenar uma imagem para cada material da materialstabela. Para fazer isso, adicionamos à tabela uma coluna cujo tipo de dadosmaterials é BLOB .

ALTER TABLEinstrução a seguir adiciona a picturecoluna à materialstabela.

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 materialstabela para visualizar seu conteúdo:

SELECT
	id,
	description,
	picture
FROM
	materials;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
SQLite Java BLOB antes da atualização

A coluna da imagem é NULL.

Segundo, prepare um arquivo de imagem e coloque-o em uma pasta, por exemplo, C:\temp, como segue:

Exemplo de imagem SQLite BLOB

Para atualizar a picturecoluna com os dados do arquivo de imagem:

  1. Primeiro, prepare uma instrução UPDATE .
  2. Em seguida, conecte-se ao banco de dados SQLite para obter o Connectionobjeto.
  3. Em seguida, crie um PreparedStatementobjeto a partir do Connectionobjeto.
  4. Depois disso, forneça os valores aos parâmetros correspondentes usando os métodos set* do PreparedStatementobjeto.
  5. Finalmente, execute a UPDATEinstrução chamando o executeUpdate()método do PreparedStatement objeto.

Observe que o driver SQLiteJDBC não implementa o setBinaryStream() método, portanto, você deve usar o setBytesmétodo.

O readFilemétodo a seguir lê um arquivo e retorna um array de bytes que podemos passar para o setBytesmé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.dbbanco 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 materialstabela novamente.

SQLite Java BLOB após atualização

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:

  1. Primeiro, prepare uma instrução SELECT .
  2. A seguir, crie um Connectionobjeto conectando-se ao banco de dados SQLite.
  3. Em seguida, crie uma instância da  PreparedStatement classe a partir do Connectionobjeto. Use o método set* do PreparedStatementobjeto para fornecer valores para os parâmetros.
  4. Depois disso, chame o executeQuerymétodo do PreparedStatementobjeto para obtê- ResultSetlo.
  5. Por fim, percorra o conjunto de resultados, use o getBinaryStream()método para obter dados e use o  FileOutputStreamobjeto para salvar os dados em um arquivo.

O readPicturemé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.jpgfile.

app.readPicture(1, "c:\\temp\\HP_Laptop_BLOB.jpg");Linguagem de código:  Java  ( java )

Executamos o programa e verificamos a c:\\temppasta:

SQLite BLOB Java JDBC Selecione BLOB

Neste tutorial, você aprendeu como atualizar e selecionar dados BLOB no banco de dados SQLite usando o driver SQLite JDBC.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *