Problema java FX sqlite label

di il
8 risposte

Problema java FX sqlite label

Ciao a tutti mi chiamo Ivan sono nuovo del forum e sono nuovo nel mondo dei forum in generale, di solito trovo soluzioni gia con altre discussioni.

Questa volta ho un problema che non riesco proprio a risolvere, sicuramente è uma sciocchezza dovuta dalla mia scarsa conoscenza di java che sto studiando come autodidatta da questo inverno, non molto insomma.

Ho creato una classe database con sqlite, dove tutto funziona perfettamente , se stampo il risultato con System.out.println() .
Ma se richiamo con un return dal controller per inserire il risultato in una label , mi viene riportato solo la prima o l'ultima riga del database.

Dato che sto imparando vorrei solo chiedervi cosa sbaglio che secondo me è il return, se potete non scrivere nessun vodice ma solo i dicarmi la retta via, poi vorrei fare da solo, è solo un progetto di studio personale.

Grazie anticipatamente a tutti e se ho violato qualche regolamento del forum chiedo scusa, segnalate che rimedio.

8 Risposte

  • Re: Problema java FX sqlite label

    tresanti82 ha scritto:


    Ma se richiamo con un return dal controller per inserire il risultato in una label , mi viene riportato solo la prima o l'ultima riga del database.
    Detto così è un po' vago, dovresti mostrare del codice.
  • Re: Problema java FX sqlite label

    Ok ma non riuscirò prima di mezzanote , grazie per ora.
  • Re: Problema java FX sqlite label

    Ecco di seguito riporto il codice:
    package magazinovini;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     *
     * @author ivanbook
     */
    public class database {
       private String letturaDb;
      
      
      public  database(){
        Connection c  = null;
        Statement stmt= null;
        String name = null;
        String nn=null;
        int qt = 0, id, row = 0;
        
        try{
          Class.forName("org.sqlite.JDBC");
          c=DriverManager.getConnection("jdbc:sqlite:C:\\Users\\ivanbook\\Desktop\\SQLiteStudio\\prova.db");
         c.setAutoCommit(false);
          System.out.println("Database letto nel try");
          stmt = c.createStatement();
            try (ResultSet rs = stmt.executeQuery(" SELECT * FROM vino")) {
                while(rs.next()){
                    
                    row=rs.getRow();
                    id= rs.getInt("id");
                   name =rs.getString("vini");
                   qt= rs.getInt("quantità");
                
                   letturaDb =name+" "+qt+"\n\r"; 
                  
                  System.out.println(name+" "+qt);
                } }
          stmt.close();
          c.close();
          
        }catch(ClassNotFoundException | SQLException e){
        System.err.println(e.getClass().getName() + ":"+ e.getMessage());
        
        }
        
        
      }     
    
        @Override
        public String toString() {
            return  letturaDb;
        } 
        
    }
  • Re: Problema java FX sqlite label

    E Questo che segue è il codice che si trova nel FXMLcontroller per viasualizzare il risultato nella label.
    @FXML
        void caricaVino(ActionEvent event) {
            
            database db=new database();
         
            visualizza.setText("I dati sono: "+db.toString() );
            
            
         
        }
    Ma come gia detto ricevo nella label solo una prodotto e contemporaneamente nell terminale tutti i prodotti preenti.
  • Re: Problema java FX sqlite label

    tresanti82 ha scritto:


    
    public class database {
       private String letturaDb;
      
    [.....]  
                while(rs.next()){
                    
                    row=rs.getRow();
                    id= rs.getInt("id");
                   name =rs.getString("vini");
                   qt= rs.getInt("quantità");
                
                   letturaDb =name+" "+qt+"\n\r"; 
                  
                  System.out.println(name+" "+qt);
    
    La variabile letturaDb la RIassegni ad ogni ciclo, quindi ti "perdi" tutte le informazioni eccetto l'ultima. Vuoi accodare tutte le informazioni? Si può fare ma devi avere letturaDb inizialmente vuota ("" .. NON null) e poi appendere con += invece che =

    Ma comunque, in ogni caso, la tua classe database è veramente mal messa e poco valida:
    a) Fai tutto nel costruttore (pessima idea, vedi anche la d) )
    b) Ottieni la informazione dal toString() dell'oggetto database (pessima idea)
    c) La tua SELECT non ha un ORDER BY quindi i dati sono ordinati a muzzo (idea non buona)
    d) Ogni volta che devi rifare la query, devi istanziare un nuovo oggetto database, andando a rifare la connection ecc... (pessima idea)

    Insomma, la tua classe database è TUTTA DA RIFARE.
  • Re: Problema java FX sqlite label

    Ciao e Grazie:
    La variabile letturaDb la RIassegni ad ogni ciclo, quindi ti "perdi" tutte le informazioni eccetto l'ultima. Vuoi accodare tutte le informazioni? Si può fare ma devi avere letturaDb inizialmente vuota ("" .. NON null) e poi appendere con += invece che =
    Con la modifica che mi hai detto funziona è ora ha anche più logica nella mia testa.

    Ma se mi dici che la classe è tutta da rifare la rifaccio, Dunque:
    Ma comunque, in ogni caso, la tua classe database è veramente mal messa e poco valida:
    a) Fai tutto nel costruttore (pessima idea, vedi anche la d) )
    d)Ogni volta che devi rifare la query, devi istanziare un nuovo oggetto database, andando a rifare la connection ecc... (pessima idea)

    Come la faresti tu? Mi scriveresti la struttura di come potrebbe essere corretta una classe Database? NO CODICE!!
    Ottieni la informazione dal toString() dell'oggetto database (pessima idea)
    b)
    Come mai è una pessima idea?? e quale sarebbe la maniera migliore??
    c) La tua SELECT non ha un ORDER BY quindi i dati sono ordinati a muzzo (idea non buona)
    Dimenticanza che avrei sistemato nel momento del bisogno.

    Scusa se ti faccio mille domande, ma studio sempre da solo e non conosco nessun programmatore , se posso avere delle lineeguida sarebbe il massimo.
    Grazie Grazie Grazie
  • Re: Problema java FX sqlite label

    tresanti82 ha scritto:


    Ma se mi dici che la classe è tutta da rifare la rifaccio, Dunque:

    Come la faresti tu? Mi scriveresti la struttura di come potrebbe essere corretta una classe Database? NO CODICE!!
    Come farlo dipende da diversi fattori. Oltretutto nelle applicazioni stand-alone in Swing o JavaFX che sia, raramente si usano meccanismi di dependency injection, quindi è meno facile/pratico gestire le dipendenze tra le classi.

    Si potrebbe pensare innanzitutto ad una classe Database che si occupa SOLO della connection (e niente query specifiche!) verso il DB, realizzandola secondo il pattern Singleton (ovvero se ne può avere UNA sola istanza).
    Quindi:
    - costruttore privato
    - metodo statico pubblico per tirar fuori la istanza.

    In questo modo si potrebbe fare in modo che: a) il Class.forName si fa una volta sola (non ad ogni query!) e b) la Connection viene creata "on demand" solo quando necessario.

    Per ottenere la connection quindi si dovrebbe fare es.:
    Connection conn = Database.getInstance().getConnection();
    (getInstance() metodo tuo statico, getConnection() metodo tuo di istanza che usa il DriverManager.getConnection).

    Poi visto che Database NON fa query, puoi fare una classe "DAO" (Data Access Object) per ciascuna entità che devi trattare. Ad esempio per il vino, VinoDAO
    public class VinoDAO {
        public String getVini() {
            Connection conn = Database.getInstance().getConnection();
            // .... tua query ecc...
    
            return ...... ;
        }
    }
    Ho lasciato String, quella stringa in cui componi name e qt, perché non ho (ovviamente) una visione maggiore/migliore della tua applicazione e quindi non so cosa vuoi fare e perché. Diciamo che comporre una stringa così non è molto buono. Innanzitutto perché la composizione è "mischiata" nel codice che fa la estrazione dal ResultSet, quindi stai mescolando logica di estrazione con il concetto di presentazione dei dati. Non molto buono ...

    Io ti proporrei di creare una classe Vino che "modella" la tabella vino e quindi di restituire una lista di oggetti Vino.

    public List<Vino> getVini()

    Sempre che non lo ritieni "troppo" per te e per le tue necessità. Poi chi userà il getVini() dovrà formattare la stringa, se vuole.


    tresanti82 ha scritto:


    Ottieni la informazione dal toString() dell'oggetto database (pessima idea)
    Come mai è una pessima idea?? e quale sarebbe la maniera migliore??
    Pessima perché la tua classe database di prima rappresentava comunque la gestione del database in generale e quindi fare in modo che un suo oggetto rappresenti il risultato di una query (e oltretutto fornito dal toString() .... è un uso un po' distorto degli oggetti.

    tresanti82 ha scritto:


    c) La tua SELECT non ha un ORDER BY quindi i dati sono ordinati a muzzo (idea non buona)
    Dimenticanza che avrei sistemato nel momento del bisogno.
    Ok
  • Re: Problema java FX sqlite label

    Grazie mille davvero, proverò a fare tutto come mi hai detto poi ti posterò il codice, così se hai voglia mi dici comè..
    Grazie.
Devi accedere o registrarti per scrivere nel forum
8 risposte