Autore Topic: Problema nel caricamento DB  (Letto 826 volte)

Offline AlphaGamma

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
  • Sistema operativo:
    MacOsx
Problema nel caricamento DB
« il: 01 Ottobre 2010, 00:08:14 CEST »
0
Ciao a tutti, è il mio primo post, e ne approfitto per esporvi il mio problema.  :-P

Sto cercando di fare un'applicazione che deve accedere ad un database Sqlite creato con un tool esterno.
Ho utilizzato come metodo quello della copia del db come si trova in svariate guide in rete, ma evidentemente sbaglio qualcosa perché non riesco a caricare il database, o meglio mi da sempre valore null.

Per completezza copio il codice.

Codice (Java): [Seleziona]
public class DbHelper extends SQLiteOpenHelper {
    private String dbPath;
    private static String DB_NAME = "mio.db";
    private static final Integer DB_VERSION = 1;    
   
    private SQLiteDatabase dataBase;
    private Context context;

   
    public DbHelper(Context context) {           
        super(context, DB_NAME, null, DB_VERSION);
        this.context = context;
        dbPath = "/data/data/" + context.getPackageName() + "/databases/";
    }  
   
        @Override
        public void onCreate(SQLiteDatabase db) {;
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
       
    public void apriDatabase() throws SQLException {
        try {
                String percorso = dbPath + DB_NAME;
                dataBase = SQLiteDatabase.openDatabase(percorso, null, SQLiteDatabase.OPEN_READONLY);
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
   
    public void createDataBase() throws IOException{
        boolean dbExist = checkDataBase();
        if(dbExist){
                //do nothing - database already exist
        }else{
                //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
                this.getReadableDatabase();
                try {
                        copyDataBase();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
    }
   
    private void copyDataBase() throws IOException{
        //Open your local db as the input stream
        InputStream myInput = context.getAssets().open(DB_NAME);
        // Path to the just created empty db
        String outFileName = dbPath + DB_NAME;
 
        // if the path doesn't exist first, create it
        File f = new File(outFileName);
        if (!f.exists()){
                f.mkdir();
                f.createNewFile();
        }
       
        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
 
        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
        }
 
        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
 
    }

    private boolean checkDataBase(){
         
        SQLiteDatabase checkDB = null;
 
        try{
                String myPath = dbPath + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
 
        }catch(SQLiteException e){
 
                //database does't exist yet.
 
        }
 
        if(checkDB != null){
 
                checkDB.close();
 
        }
 
        return checkDB != null ? true : false;
    }

    @Override
        public synchronized void close() {
            if(dataBase != null)
                dataBase.close();
            super.close();
        }
     
    public Cursor cercaDati()
    {
        try {
                return dataBase.query("Tabella",
                                new String[] {"_id", "Nome"},
                                null,
                                null,
                                null,
                                null,
                                null);
        }      
        catch (SQLiteException ex) {
                throw new Error("Errore nel caricamento del DB");
        }
    }

Questo invece è il frammento che lo utilizza:
Codice (Java): [Seleziona]
       
        DbHelper dbHelper = new DbHelper(getApplicationContext());
        try {
                        dbHelper.createDataBase();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                dbHelper.apriDatabase();
        Cursor cursor;
                try {
                        cursor = dbHelper.cercaDati();
                } catch(Exception ex){
                        throw new Error("Impossibile caricare i dati");
                }
                dbHelper.close();

Solo che il mio cursore è bello vuoto.
Qualcuno mi può aiutare? Grazie!




Offline AlphaGamma

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
  • Sistema operativo:
    MacOsx
Re:Problema nel caricamento DB
« Risposta #1 il: 02 Ottobre 2010, 23:05:16 CEST »
0
Capito il problema.
Il db va chiuso DOPO aver usato il cursore (il cursore è un reference a dati che vengono effettivamente recuperati solo quando vengono richiesti). :)

Mi spiace però che non mi abbia risposto nessuno.  :-X  :'(

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Problema nel caricamento DB
« Risposta #2 il: 03 Ottobre 2010, 13:38:32 CEST »
0
guardando il codice che hai esposto, non usi il cursore.
ma lo ottieni soltanto, e in quel momento il cursor non è vuoto...e giustamente, l'estrazione dei dati dal cursor, va fatta in quel momento e prima di chiudere il db.

probabilmente hai omesso la parte di codice più importante, quella dopo il close() dove usavi il cursore...


buona domenica ;D






Offline AlphaGamma

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Desire
  • Sistema operativo:
    MacOsx
Re:Problema nel caricamento DB
« Risposta #3 il: 07 Ottobre 2010, 19:23:53 CEST »
0
guardando il codice che hai esposto, non usi il cursore.
ma lo ottieni soltanto, e in quel momento il cursor non è vuoto...e giustamente, l'estrazione dei dati dal cursor, va fatta in quel momento e prima di chiudere il db.

probabilmente hai omesso la parte di codice più importante, quella dopo il close() dove usavi il cursore...


buona domenica ;D

Grazie mille della dritta.
No, non l'avevo omessa, semplicemente ritornavo il cursore al chiamante, dopo aver chiuso la connessione al db.

Offline zEuSsE

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC-dream
  • Sistema operativo:
    Mac Os X 10.6.5
Re:Problema nel caricamento DB
« Risposta #4 il: 14 Febbraio 2011, 16:06:19 CET »
0
Ciao, anche io stavo cercando di sviluppare un'app che usa un db esterno. In particolare utilizzo postgresql, ma non riesco  capire come esportare il file che dovrebbe essere il mio database  :'( aiuto!!