Pagina 3 di 4 PrimoPrimo 1234 UltimoUltimo
Mostra risultati da 21 a 30 di 32

Discussione: programmare in Java attraverso Geany

  1. #21
    Data registrazione
    Jan 2010
    Sesso
    Uomo
    Messaggi
    18,850
    Grazie dati 
    5,611
    Grazie ricevuti 
    3,677
    Ringraziato in
    2,988 post

    Riferimento: programmare in Java attraverso Geany



    Il messaggio di errore nel catch va a finire sul terminale come output, così sai che qualcosa è andato storto.
    Ovviamente potresti anche sostituire il println con una finestra di dialogo che avvisa l'utente o altro, ma dipende sempre dall'obbiettivo finale.

    DIMENTICATI LE VARIABILI STATICHE. Servono a ottenere tutt'altra cosa. Il DB non è un oggetto statico per definizione, una classe DB sta a più oggetti DB diversi, e questo richiede uso di variabili NON statiche, ma diverse per ogni istanza.

    Il motivo per cui in quel codice i parametri vengono passati al costruttore è proprio quello di EVITARE un uso statico della classe, se i parametri fossero dati al metodo connetti (che in quanto non costruttore può essere chiamato più volte sullo stesso oggetto) diventerebbe possibile aprire più database con lo stesso oggetto e questo sarebbe sbagliato.

    Esempio di codice corretto:

    Codice:
    Only registered members can view code.


    E non è assolutamente vero che mantenendo il costruttore non puoi ottenere nessuna variabile di ritorno, perché dici ciò?
    La var da interrogare te là da il metodo connetti, questo vuol dire che quando chiami la tua classe fai:

    Codice:
    Only registered members can view code.
    Questo semplificando, comunque vedi che dal metodo connetti ottieni la tua variabile.

    E ricordati sempre che È SBAGLIATO snellire il codice scrivendo meno metodi possibili, si va sempre a complicarsi la vita per niente.

    Esempio di codice SBAGLIATO:
    Codice:
    Only registered members can view code.
    Spero di essere stato chiaro.
    #SaveYourInternet - Fight the #CensorshipMachine
    «non esistono "mani destre di Dio" ma solo utenti con la volontà di aiutare.» (LadyHawke)

    Rispondi citando Rispondi citando Il mio PC

  2. # ADS
    Google Adsense Circuito Adsense
    Data registrazione
    da sempre
    Messaggi
    molti
     
  3. #22
    Data registrazione
    Apr 2019
    Sesso
    Uomo
    Messaggi
    18
    Grazie dati 
    0
    Grazie ricevuti 
    4
    Ringraziato in
    3 post

    Riferimento: programmare in Java attraverso Geany

    Purtroppo i miei "non ho capito" non sono ancora finiti. A piccoli passi sto andando avanti, però forse è meglio procedere con una domanda per volta.
    Perciò, tornando ancora sul concetto del metodo costruttore che conosco per averlo messo in pratica in linguaggio diverso da java, vorrei riuscire a costruire una classe che si occupi dell'apertura della connessione con un DB.
    Detto questo, dalla classe col main vorrei far partire comandare nel main stesso o in altro modulo della classe una o più query per leggere, inserire, aggiornare, cancellare record del DB, committando quei record modificati, inseriti o concellati. Il Db quindi dovrebbe rimanere connesso per tutto il tempo necessario, lasciando solo alla fine di un ciclo logico completo di attività sul DB, il compito di chiudere la connessione aperta all'avvio di quel ciclo.
    Premesso ciò, non ho ancora capito come posso essere sicuro di eseguire solo una volta l'apertura della connessione al DB.
    Perciò, forse può servire comunicarti quello che ho capito.
    Fino ad ora ho capito che posso costruire una classe esterna che contenga al suo interno
    • un metodo costruttore per istanziare l'apertura della connessione, come iniziazione di un ciclo di attività su un DB.
      un metodo per l'esecuzione di query di lettura da richiamare di volta in volta coi parametri di lettura
      un metodo per l'esecuzione di query di scrittura da richiamare per inserire record attraverso appropriati parametri
      un metodo per l'esecuzione di query di aggiornamento da richiamare per modificare record esistenti attraverso appropriati parametri
      un metodo per l'esecuzione di query di cancellazione record da richiamare coi parametri pertinenti al record da cancellare.
      un metodo per la chiusura della connessione aperta all'inizio del ciclo.

    ma io vorrei affidare a quella classe esterna soltanto l'apertura e la chiusura della connessione.

    Dal tuo ultimo post
    E non è assolutamente vero che mantenendo il costruttore non puoi ottenere nessuna variabile di ritorno,
    capisco che, anche se il costruttore è nominalmente tipizzato per non restituire valori attraverso l'istruzione return, posso comunque interrogare una sua variabile per conoscere o rilevare il suo contenuto.

    Io ricordavo che le variabili di una classe fossero visibili dall'esterno solo se dichiarate come "public" o "private static",
    Il tuo esempio di codice, in proposito riporta soltanto come rilevare il valore contenuto nella variabile "ris"
    Codice:
    Only registered members can view code.
    non contiene infatti la dichiarazione esplicita della variabile. Ciò mi fa pensare che anche una variabile locale possa essere vista al di fuori del metodo.
    Ultima modifica di pierigia; 10-05-19 alle 16: 24.

    Rispondi citando Rispondi citando Il mio PC

  4. #23
    Data registrazione
    Jan 2010
    Sesso
    Uomo
    Messaggi
    18,850
    Grazie dati 
    5,611
    Grazie ricevuti 
    3,677
    Ringraziato in
    2,988 post

    Riferimento: programmare in Java attraverso Geany

    Il Db quindi dovrebbe rimanere connesso per tutto il tempo necessario, lasciando solo alla fine di un ciclo logico completo di attività sul DB, il compito di chiudere la connessione aperta all'avvio di quel ciclo.
    È proprio a questo che serve separare il metodo chiudi dal metodo apri.
    Così il DB rimane aperto finché non chiami il metodo chiudi e puoi richiamare l'oggetto per fare ciò che vuoi.


    ma io vorrei affidare a quella classe esterna soltanto l'apertura e la chiusura della connessione.
    E sbaglieresti.
    Non capisco dove starebbe il tuo pro nel fare questo, ma ti garantisco che ti stai incaponendo per nulla.


    capisco che, anche se il costruttore è nominalmente tipizzato per non restituire valori attraverso l'istruzione return, posso comunque interrogare una sua variabile per conoscere o rilevare il suo contenuto.
    No. Non esistono variabili del costruttore, a meno che tu metta la dichiarazione esplicita dentro il costruttore, ma così potrebbe essere vista solo all'interno del costruttore.

    Tutte le variabili di classe invece possono essere viste all'interno sia del costruttore che di tutti gli altri metodi della classe.


    Io ricordavo che le variabili di una classe fossero visibili dall'esterno solo se dichiarate come "public" o "private static",
    Si e no.

    I membri pubblici possono essere visti dall'esterno, i membri protected possono essere visti dalle sottoclassi e in java dalle classi appartenenti allo stesso package, private NON possono essere viste dall'esterno in nessun caso.

    STATIC non c'entra nulla, dichiara una variabile come "di classe" anziché di "istanza", ti ho fatto prima un esempio in proposito, non la rende automaticamente pubblica.

    Comunque sono cose che trovi in qualunque guida di Java, anche in quelle che non insegnano a progettare ma solo la sintassi.

    Il tuo esempio di codice, in proposito riporta soltanto come rilevare il valore contenuto nella variabile "ris"
    non contiene infatti la dichiarazione esplicita della variabile. Ciò mi fa pensare che anche una variabile locale possa essere vista al di fuori del metodo.
    Temo che tu non abbia capito che cosa fa il mio codice.

    Leggendo l'ultima frase sembra che tu abbia dimenticato due NON.

    La dichiarazione esplicita c'è eccome, è quella in rosso:

    Database db1 = new Database("macchine.db");
    boolean ris = db1.connetti();
    if (!ris) {
    // il db non si è connesso - fai qualcosa
    }

    Ho utilizzato la sintassi compatta di java, cioè inizializzo direttamente la variabile invece di fare due passaggi.

    E dichiarata così significa esattamente il contrario, cioè che non può essere vista al di fuori del metodo.
    Supponendo che quel codice si trovi nel metodo MAIN, non potrai vedere la variabile ris fuori dal metodo main.

    Tornando alla prima frase, il mio metodo non rileva il valore contenuto nella variabile ris, ma quello restituito dal metodo connetti e lo mette nella variabile ris. Riporto in pseudocodice:

    1 - Dichiaro una variabile di tipo Database e la inizializzo con un nuovo (new) oggetto Database che lego al file "macchine.db".
    2 - Dichiaro una variabile di tipo ris e la inizializzo con il valore restituito dal metodo connetti() chiamato sull'oggetto database istanziato poco prima che prova a connettere il database e restituisce vero se riesce, falso in caso di errore.
    3 - controllo se il valore di ris è falso (il punto esclamativo inverte il valore, per cui se è vero diventa falso e non entra nell'if, viceversa esegue le istruzioni nell'if).

    È più chiaro così?

    In altre parole questo ti evita di modificare le variabili per sbaglio, se invece tu lasciassi pubblica la variabile all'interno della classe Database potresti non solo rilevarla ma anche modificarla e potrebbe capitare che pensando di agire sulla variabile di un'altro database andassi a modificare quella del database sbagliato, ottenendo che il tuo programma non sa più veramente se quel database è connesso o meno.
    #SaveYourInternet - Fight the #CensorshipMachine
    «non esistono "mani destre di Dio" ma solo utenti con la volontà di aiutare.» (LadyHawke)

    Rispondi citando Rispondi citando Il mio PC

  5. #24
    Data registrazione
    Apr 2019
    Sesso
    Uomo
    Messaggi
    18
    Grazie dati 
    0
    Grazie ricevuti 
    4
    Ringraziato in
    3 post

    Riferimento: programmare in Java attraverso Geany

    Citazione Originariamente scritto da Andy86 Vedi messaggio
    ma io vorrei affidare a quella classe esterna soltanto l'apertura e la chiusura della connessione.
    E sbaglieresti.
    Non capisco dove starebbe il tuo pro nel fare questo, ma ti garantisco che ti stai incaponendo per nulla.
    Scusa, lo so che ti sto impegnando oltremisura nel cercare di instradarmi correttamente, ma se non capisco non riesco ad impadronirmi della tecnica giusta.

    Una query, come sai, mi permette anche di scorrere tutti i record che la riguardano e, mantenendo le istruzioni dentro una classe esterna, non vedo come posso scorrerne i record e restituire al chiamante un record alla volta per consentirne il trattamento:
    1. accedo alla classe richiamando il metodo di lettura dei record
    2. il metodo esegue la lettura del 1° record della serie e lo restituisce nell'istruzione return
    3. eseguo il trattamento e ritorno a richiamare il metodo
    4. il metodo ritorna ad eseguire la lettura del 1° record della serie e lo restituisce come la 1.a volta
    5. viene pertanto generato, secondo la mia vista attuale,un loop infinito


    Se invece eseguo tale accesso direttamente in uno dei metodi della classe principale (per. es. il main, riesco a leggere e trattare con la corretta sequenza tutti i record ed a trattarli uno dopo l'altro.
    L'esempio riportato nel link che ti ho passato qualche post fa, la classe chiamata riporta un metodo query che restituisce un vettore. Il che significa che se la query dovesse scorrere migliaia di record, verrebbero restituiti tutti insieme, a fine query, con un impegno abissale di memoria. Ciò mi sembra pesante ed a rischio superamento di spazio disponibile con inevitabile crash del programma.

    Ecco il motivo per cui, in questo momento, non vedo di buon occhio il ricorso ad una classe che gestisca il Db per tutte le necessità possibili, dall'apertura della connessione alla sua chiusura.


    P.S.
    Ho corretto il programma, lasciando alla classe ConettiDB solo l'apertura e la chiusura della connessione e la compilazione è andata bene, eccetto un errore attinente ad un parametro di una query, ma per ora non credo sia opportuno entrare in dettagli fuorvianti daile mie incertezze sulla logica gestionale del DB.
    Ultima modifica di pierigia; 10-05-19 alle 21: 37.

    Rispondi citando Rispondi citando Il mio PC

  6. #25
    Data registrazione
    Jan 2010
    Sesso
    Uomo
    Messaggi
    18,850
    Grazie dati 
    5,611
    Grazie ricevuti 
    3,677
    Ringraziato in
    2,988 post

    Riferimento: programmare in Java attraverso Geany

    Allora, sul fatto delle performance non sono informato e in questo momento non ho né tempo né voglia di leggermi la documentazione al posto tuo (), comunque per fare quello che vuoi fare tu la cosa più semplice è restituire direttamente l'oggetto ResultSet al chiamante, cioè:

    public ResultSet Query(String s){} dentro la classe DB.

    Così accedi al ResultSet dalla classe main e ti fai lì il tuo loop, però mantieni l'accesso al db nella classe db e non rischi conflitti in caso di gestione di più db.

    Ti assicuro che se dovessi (anche in futuro) aggiungere più database separati al tuo programma avere un codice ben gestito ti eviterebbe un sacco di rogne, tu stai ragionando partendo dal presupposto che la tua applicazione ha un solo DB è questo è sbagliato a prescindere perché ti porterebbe a riscrivere tutto quando deciderai di aggiungere un secondo DB e per esperienza so che accade sempre. Magari dopo mesi o anni, ma accade.
    #SaveYourInternet - Fight the #CensorshipMachine
    «non esistono "mani destre di Dio" ma solo utenti con la volontà di aiutare.» (LadyHawke)

    Rispondi citando Rispondi citando Il mio PC

  7. #26
    Data registrazione
    Apr 2019
    Sesso
    Uomo
    Messaggi
    18
    Grazie dati 
    0
    Grazie ricevuti 
    4
    Ringraziato in
    3 post

    Riferimento: programmare in Java attraverso Geany

    Il tentativo di gestire DB sta diventando sempre più difficoltoso. Ogni volta che mi accendi una lampadina, ho l'impressione cghe finalmente posso andare avanti da solo ... invece, ogni prova nuova mi rispedisce immancabilmente nel buio.
    Volendo richiamare una classe esterna per la gestione di un DB, occorre che capisca bene come passare e ricevere dati per ciscun modulo da richiamare, interno alla suddetta Classe.
    E visto che parliamo di gestione DB, ho rinominato la mia classe ConnettiDB, chiamandola da orra in avanti GestDB, dove ho inserito il return dell'oggetto ResultSet al chiamante, seguendo il tuo suggeimento, strumento per me assolutamente nuovo.
    Poi, proseguendo nello scorrimento delle istruzioni nel main, ho rivisto il primo dei passi successivi che richiede la query in lettura di alcuni record di una 2.a tabella (movimgg), filtrati dall'attributo "WHERE" ed ecco che ritorna il buio a cui mi riferivo all'inizio di questo post. Infatti da questa nuova query mi occorrerebbe ritornare al main (chiamante) , solo il contenuto della colonna "DtCoMovgg" del 1° record fra quelli filtrati, in ordine decrescente, quello con la data più recente.
    Però.volendo ragionare in termini astratti, teoricamente non so quante celle posso dover ritornare al chiamante, quindi ho pensato di costruire un vettore contenente elementi di type diversi, attraverso la classe "ArrayList". Anche la query andrebbe specializzata con l'applicazione dell'oggetto "ResultSetMediaData", con cui potrei riconoscere i vari type delle celle componenti la singola riga della query.
    Credo che sia questa la strada da intraprendere ed ho provato dopo avere cominciato a modificare il mio programma studio. Ho anche avviato una compilazione per fare le prime verifiche, ma ho un nuovo grosso ostacolo: mi rimane un errore che non capisco.
    Codice:
    Only registered members can view code.
    Per completezza allego anche i due file del programma.
    File allegati File allegati
    Ultima modifica di pierigia; 23-05-19 alle 22: 06.

    Rispondi citando Rispondi citando Il mio PC

  8. #27
    Data registrazione
    Jan 2010
    Sesso
    Uomo
    Messaggi
    18,850
    Grazie dati 
    5,611
    Grazie ricevuti 
    3,677
    Ringraziato in
    2,988 post

    Riferimento: programmare in Java attraverso Geany



    Come ho già detto io non ho mai lavorato con i DB in java e non ho esperienza circa l'uso di resultset.

    Comunque l'errore che riporti è il tipico errore che esce quando ci si dimentica una chiusura da qualche parte (tipo una grafa o un punto e virgola), tradotto vuol dire che lui ha raggiunto la fine del file mentre c'era ancora qualcosa di aperto.

    Ora guardo.

    Si, manca effettivamente una grafa di chiusura alla fine del Main.

    E un consiglio, quando all'interno di un IF c'è una sola riga di codice si possono omettere le grafe, tipo:

    if (a == b) System.out.println("ok");

    Così il codice diventa più leggibile.

    da questa nuova query mi occorrerebbe ritornare al main (chiamante) , solo il contenuto della colonna "DtCoMovgg" del 1° record fra quelli filtrati, in ordine decrescente, quello con la data più recente.
    Questo in Java dovresti poterlo fare con i metodi dell'oggetto resultSet, tipo getNString(int columnIndex), però devi scorrere a mano le tuple con next() e per ogni tupla chiami quel metodo.

    Comunque già partendo dall'SQL potresti impostare la query per restituire solo le colonne che ti interessano, quindi senza bisogno di applicare il filtro a monte, utilizzando SELECT: https://www.w3schools.com/sql/sql_select.asp
    #SaveYourInternet - Fight the #CensorshipMachine
    «non esistono "mani destre di Dio" ma solo utenti con la volontà di aiutare.» (LadyHawke)

    Rispondi citando Rispondi citando Il mio PC

  9. #28
    Data registrazione
    Apr 2019
    Sesso
    Uomo
    Messaggi
    18
    Grazie dati 
    0
    Grazie ricevuti 
    4
    Ringraziato in
    3 post

    Riferimento: programmare in Java attraverso Geany

    Oggi ho raggiunto un traguardo: sono riuscito a compilare il mio programma, ma ahimè l'avvio non ha funzionato. Ecco il risultato della prova:
    Codice:
    Only registered members can view code.
    Non capisco perchè sia stata sollevata l'eccezione alla connessione del DB. Ho guardato anche i permessi sul DB e non ci sono limitazioni, il percorso indicato nella connection
    Codice:
    Only registered members can view code.
    è corretto. E allora, perchè?

    Rispondi citando Rispondi citando Il mio PC

  10. #29
    Data registrazione
    Jan 2010
    Sesso
    Uomo
    Messaggi
    18,850
    Grazie dati 
    5,611
    Grazie ricevuti 
    3,677
    Ringraziato in
    2,988 post

    Riferimento: programmare in Java attraverso Geany

    Forse non hai installato il Driver.

    Su che distro sei?

    Prova a vedere se c'è un pacchetto tipo "java-sqlite-jdbc".
    #SaveYourInternet - Fight the #CensorshipMachine
    «non esistono "mani destre di Dio" ma solo utenti con la volontà di aiutare.» (LadyHawke)

    Rispondi citando Rispondi citando Il mio PC

  11. #30
    Data registrazione
    Apr 2019
    Sesso
    Uomo
    Messaggi
    18
    Grazie dati 
    0
    Grazie ricevuti 
    4
    Ringraziato in
    3 post

    Riferimento: programmare in Java attraverso Geany

    Citazione Originariamente scritto da Andy86 Vedi messaggio
    Forse non hai installato il Driver.
    Su che distro sei?
    Per tutte le prove di studio, sto usando soltanto LinuxMint

    Prova a vedere se c'è un pacchetto tipo "java-sqlite-jdbc".
    No, non ce l'ho
    Codice:
    Only registered members can view code.

    Rispondi citando Rispondi citando Il mio PC

Segnalibri

Regole di scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
Cookies:direttiva 2009/136/CE (E-Privacy)

Il sito utilizza cookies propri e di terze parti per maggiori informazioni faq - Termini di servizio - Cookies
Il forum non puo' funzionare senza l'uso dei cookies pertanto l'uso della community è vincolato dall'accettazione degli stessi, nel caso contrario siete pregati di lasciare la community, proseguendo la navigazione acconsenti all’uso dei cookie