Visualizzazione dei risultati da 1 a 6 su 6

Discussione: SQLITE dentro jar

Hybrid View

  1. #1

    SQLITE dentro jar

    Salve qualcuno mi saprebbe spiegare come faccio ad inserire un db sqlite dentro un jar?
    Il database mi servirà per memorizzare nuovi dati e leggere quelli già presenti. Il fine è quello di creare un tool "portatile". In qualsiasi computer io lo lanci esso dovrà poter accedere al database.
    Non sono un esperto di Java..
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da peppesbe Visualizza il messaggio
    Salve qualcuno mi saprebbe spiegare come faccio ad inserire un db sqlite dentro un jar?
    Il database mi servirà per memorizzare nuovi dati e leggere quelli già presenti. Il fine è quello di creare un tool "portatile". In qualsiasi computer io lo lanci esso dovrà poter accedere al database.
    Una qualunque "base dati" NON può essere usata, modificata direttamente dentro un jar. Quello che puoi fare è preparare tu un database SQLite "iniziale", con le tabelle create vuote o prepopolate (se si tratta es. di tabelle di codici o descrizioni fisse) e poi metterlo dentro il jar. Ma alla prima esecuzione della applicazione su una macchina, andrai a rintracciare il file del db (usando il principio delle "risorse" inteso da getResource/getResourceAsStream di java.lang.Class) e lo copierai su disco in un qualche percorso "noto" e facilmente rintracciabile (es. da qualche parte sotto la directory "home" dell'utente). Quindi la applicazione userà sempre e solo il DB fuori dal jar in quella certa locazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    andbin Grazie mille!!!!
    al momento però non riesco a trovare il modo per acquisisre il Path dove si trova il database.
    In sostanza usando la seguente:
    String pathDB=System.getProperty("user.dir") + "\\bin\\DataBase.sqlite"
    quando avvio il tool direttamente da Eclipse tutto funziona perfettamente.
    Mentre quando copio il tool su una pendrive e lo avvio da un altro pc, non funziona più, perche non riesce a trovare il percorso del Database.
    Come devo fare per unsare il principio delle risorse getResource/getResourceAsStream di java.lang.Class?


    Grazie,
    Giuseppe

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da peppesbe Visualizza il messaggio
    al momento però non riesco a trovare il modo per acquisisre il Path dove si trova il database.
    In sostanza usando la seguente:
    String pathDB=System.getProperty("user.dir") + "\\bin\\DataBase.sqlite"
    La property "user.dir" rappresenta la directory "corrente" ed è molto vaga, nel senso che dipende da diversi fattori. Quindi non va granché bene. Io dicevo la directory "home" dell'utente (su Windows qualcosa tipo C:\Users\Andrea, sui Linux qualcosa tipo /home/andrea ). E questa si rintraccia con la system property "user.home".
    Tipicamente sotto la home dell'utente si mette una directory specifica per l'applicazione. Che sempre tipicamente per convenzione (e per "copiare" un po' il comportamento dei Linux, inizia con il punto "." )

    Quindi in codice, qualcosa del tipo (non l'ho provato ora):

    codice:
    File appDir = new File(System.getProperty("user.home"), ".myapp");
    appDir.mkdir();     // assicura che la .myapp sia creata se non esiste (mi aspetto che la home esista!)
    
    File sqliteFile = new File(appDir, "DataBase.sqlite");
    
    if (!sqliteFile.exists()) {
        // il file del db NON esiste ... crealo!
    }

    Quote Originariamente inviata da peppesbe Visualizza il messaggio
    Come devo fare per unsare il principio delle risorse [COLOR=#333333]getResource/getResourceAsStream di java.lang.Class?
    Metti il file "iniziale" del DB in un certo package, es. com.esempio.myapp.resources

    Se in questo package ci metti una classe di utilità es. AppResources:

    codice:
    package com.esempio.myapp.resources;
    
    public class AppResources {
    
       .....
       // qui puoi fare
           InputStream is = AppResources.getClass().getResourceAsStream("DefaultDataBase.sqlite");
    }

    DefaultDataBase.sqlite in questo modo è relativo al package della classe e se il file è in quello stesso package, la JVM lo trova di certo.
    Ottieni un InputStream, devi copiare tu tutto il contenuto in quel file referenziato da sqliteFile di prima. Si tratta di I/O banale/basilare che DEVI conoscere. Altrimenti ci sono librerie apposite che hanno metodi di utility per copiare da InputStream a File e anche altro.


    P.S. ho visto l'altra tua discussione. Te lo dico subito: NON ti serve sapere il nome e/o il percorso del jar. Anche se teoricamente/tecnicamente è fattibile, è brutto farlo oltre che "critico".
    Ultima modifica di andbin; 04-10-2016 a 18:39
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Scusa, scritto prima male io per fretta:

    InputStream is = AppResources.class.getResourceAsStream("DefaultDataBase.sqlite");
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Grazie mille andbin. Mi hai chiarito le idee.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.