DOMANDA Database image e jtable

toni1705

Nuovo Utente
98
9
Salve sto sviluppando un progetto Java, ho un database fatto in questo modo(tutto inventato da me)
SQL:
CREATE TABLE caffe(
id INT(10) PRIMARY KEY NOT NULL,
marca VARCHAR(20) NOT NULL,
tipo VARCHAR(20) NOT NULL,
p INT(10) NOT NULL,
foto BLOB);
come potete vedere ho salvato una foto come blob.
ho connesso il database correttamente al jtable e riesco a recuperare e stampare tutti i valori corretamente,
Solo che non riesco ad integrare la foto nella cella .
Java:
String id,marca,tipo,p,foto;
            while(result.next()==true)
            {
                id=result.getString(1);
                marca=result.getString(2);
                tipo=result.getString(3);
                p=result.getString(4);
               foto=result.getByte(5);
              
                String []row= {id,marca,tipo,p,foto};
                model.addRow(row);
quando ci provo mi compare l'errore in cui mi dice che non si può giustamente convertire da byte a String.
ma con quale metodo posso recuperare dal database questa foto ed inserire nella cella della mia jtable?
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
In realtà non è la mossa giusta usare un BLOB per salvare le immagini. Solitamente le immagini vengono salvate su file system e nel db metti il path all'immagine.

Se usi Swing, per mostrarla dovresti usare ImageIcon se non vado errato. Andrebbe poi inserito in una JLabel (lo passi come parametro al costruttore).
Puoi anche usare un JPanel e fare l'override di paintComponent.

Se usi una tabella... non ricordo, domani da pc provo a cercare, se non avrai già risolto.

EDIT:
Puoi dare un occhio a questo:

Java:
import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class Main {
  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new BorderLayout());

    MyTableModel model = new MyTableModel();

    JTable table = new JTable(model);
    table.setRowHeight(80);
    table.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
    JScrollPane pane = new JScrollPane(table);
    frame.getContentPane().add(BorderLayout.CENTER, pane);
    frame.setSize(500, 400);
    frame.setVisible(true);
  }
}

class MyTableModel extends AbstractTableModel {
  public Object getValueAt(int row, int column) {
    return "" + (row * column);
  }

  public int getColumnCount() {
    return 4;
  }

  public int getRowCount() {
    return 5;
  }
}

class ImageRenderer extends DefaultTableCellRenderer {
  JLabel lbl = new JLabel();

  ImageIcon icon = new ImageIcon(getClass().getResource("sample.png"));

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    lbl.setText((String) value);
    lbl.setIcon(icon);
    return lbl;
  }
}

Fonte: http://www.java2s.com/Code/Java/Swing-JFC/RenderinganimageinaJTablecolumn.htm

Magari ci sono altri modi, dovresti cercare.
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Quoto quanto detto sopra.
Nel DB bisogna salvare solo il path dell'immagine. Quest'ultima va salvata a parte.
 
  • Mi piace
Reazioni: toni1705

Andretti60

Utente Èlite
6,440
5,091
L’errore è che stai cercando di convertire il Blob, che è un semplice vettore di byte, in una stringa. Lo devi convertire in una immagine, in pratica invertendo il processo che hai usato in precedenza per convertire l’immagine in un vettore (memorizzato poi come un Blob).

In realtà non è la mossa giusta usare un BLOB per salvare le immagini. Solitamente le immagini vengono salvate su file system e nel db metti il path all'immagine.


Quoto quanto detto sopra.
Nel DB bisogna salvare solo il path dell'immagine. Quest'ultima va salvata a parte.

No ragazzi, in realtà come memorizzare le immagini dipende molto dal tipo della applicazione, quindi dalla dimensione e dalla quantità delle immagini memorizzate. Memorizzare nel database solo il path del file contenente l’immagine è solo uno dei metodi, ma che in certe applicazioni presenta parecchi problemi ed è impraticabile. In genere trovare il metodo migliore richiede un attento studio del problema, seguito da seri studi di praticabilità e ottimizzazione. Il metodo perfetto che vada bene in tutti i casi non esiste. Dove lavoro io usiamo diversi sistemi di memorizzazione inclusi database, a seconda della applicazione, e continuiamo a ottimizzarli.
 
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
Quoto quanto detto sopra.
Nel DB bisogna salvare solo il path dell'immagine. Quest'ultima va salvata a parte.
L’errore è che stai cercando di convertire il Blob, che è un semplice vettore di byte, in una stringa. Lo devi convertire in una immagine, in pratica invertendo il processo che hai usato in precedenza per convertire l’immagine in un vettore (memorizzato poi come un Blob).






No ragazzi, in realtà come memorizzare le immagini dipende molto dal tipo della applicazione, quindi dalla dimensione e dalla quantità delle immagini memorizzate. Memorizzare nel database solo il path del file contenente l’immagine è solo uno dei metodi, ma che in certe applicazioni presenta parecchi problemi ed è impraticabile. In genere trovare il metodo migliore richiede un attento studio del problema, seguito da seri studi di praticabilità e ottimizzazione. Il metodo perfetto che vada bene in tutti i casi non esiste. Dove lavoro io usiamo diversi sistemi di memorizzazione inclusi database, a seconda della applicazione, e continuiamo a ottimizzarli.
Ho provato a memorizzare il path nel database. Ma mi blocco perchè giustamente non ho capito come portarlo nella cella.Ho trovato tanti esempi ma solo relativi ad esempi generali di come mostrare una foto in un frame.
Per la conversione da blob ad immagine avrei una situazione del genere giusto?
Java:
1) Prendere i dati dal database
 Blob blb = stmt.executeQuery(...).getBlob("colonna foto");
 2)Leggere Il blolb in un'array di byte
    byte[] imagebytes = blob.getBytes(0, blob.length());
3) Convertire l'array di bite in un' iimmagine bufferizzata?
    BufferedImage theImage=ImageIO.read(new ByteArrayInputStream(imagebytes));


 Ho provato cosi
while(result.next()==true)
            { 
                id=result.getString(1);
                marca=result.getString(2);
                miscela=result.getString(3);
                prezzo=result.getString(4);
                blob=result.getBlob(5);
                int blobLength = (int) blob.length();  
                 byte[] bytes = blob.getBytes(1, blobLength);
                 blob.free();
                 BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
                 ImageIcon icon = new ImageIcon(img);  
                Object []row= {id,marca,miscela,prezzo,blob};
                model.addRow(row);
}
java.sql.SQLException: not implemented by SQLite JDBC driver mi riporta questo errore :/
 
Ultima modifica:

toni1705

Nuovo Utente
98
9
SQL LITE CONNECTED(stampato dal codice che genera la connessione al database)
java.sql.SQLException: not implemented by SQLite JDBC driver
compare solo questo nel terminale.
 

Fenix27

Utente Attivo
863
220
No ragazzi, in realtà come memorizzare le immagini dipende molto dal tipo della applicazione, quindi dalla dimensione e dalla quantità delle immagini memorizzate. Memorizzare nel database solo il path del file contenente l’immagine è solo uno dei metodi, ma che in certe applicazioni presenta parecchi problemi ed è impraticabile. In genere trovare il metodo migliore richiede un attento studio del problema, seguito da seri studi di praticabilità e ottimizzazione. Il metodo perfetto che vada bene in tutti i casi non esiste. Dove lavoro io usiamo diversi sistemi di memorizzazione inclusi database, a seconda della applicazione, e continuiamo a ottimizzarli.

Piccolo OT: anche io ho sempre pensato che salvare direttamente le immagini in un DB, al posto del suo path, fosse una pratica poco usata e inefficiente. Per curiosità puoi dirmi (o linkare qualche risorsa) in quali casi conviene usare BLOB o il path ?
 

Andretti60

Utente Èlite
6,440
5,091
Piccolo OT: anche io ho sempre pensato che salvare direttamente le immagini in un DB, al posto del suo path, fosse una pratica poco usata e inefficiente. Per curiosità puoi dirmi (o linkare qualche risorsa) in quali casi conviene usare BLOB o il path ?
Certamente, eccoti un ottimo articolo sul soggetto, con una lista di referenze.
La risposta è “dipende” dal tipo di applicazione, e da come il database cresce con il tempo. Come indicazione di massima, si preferisce salvare piccole immagini (dell’ordine del centinaio di KB) che non vengono modificate nel tempo nel database, altrimenti nel file system. Svantaggi del file system sono quelli tipici del NON usare un database:
- Problemi nel creare transazioni ACID
- Mantenere consistenza del database
- Occorre avere permessi al file system separati da quelli del database
- Si deve creare un separato servizio per accedere alle immagini (tipicamente un web service)
- Occorre un backup separato
Ovviamente questo problema non è solo relativo a immagini, ma qualsiasi altro tipo di grande quantità di dati in formato binario.

In pratica quello che si fa con i database è fare una stima dell’uso del database per il progetto iniziale, poi continuare a collezionare statistiche di uso, salvarle e continuare ad analizzarle col tempo per controllare se il database continua a mantenere la sua efficienza.

 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili