Autore Topic: Backup database della mia app su sd: problemi  (Letto 898 volte)

Offline francesco.disciascio

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Backup database della mia app su sd: problemi
« il: 27 Dicembre 2011, 12:19:31 CET »
0
Ciao a tutti,
sto provando a fare un backup del db della mia app sulla scheda sd. In giro ho trovato vari esempi, tutti piuttosto simili; io ho usato questo:

Codice (Java): [Seleziona]
try {
void copyFile() throws IOException
    {
        File src = new File(Environment.getDataDirectory() + "/data/{package}/databases/nomeDatabase.db");

        File exportDir = new File(Environment.getExternalStorageDirectory(), "exampledata");
        if (!exportDir.exists())
        {
                exportDir.mkdirs();
        }
        File dst = new File(exportDir, src.getName());
        FileChannel inChannel = new FileInputStream(src).getChannel();
        FileChannel outChannel = new FileOutputStream(dst).getChannel();
        try {
           inChannel.transferTo(0, inChannel.size(), outChannel);
        } finally {
           if (inChannel != null)
              inChannel.close();
           if (outChannel != null)
              outChannel.close();
        }
     }
   
}

questo codice, andando in debug, provoca l'eccezione FileNotFoundException su questa riga
Codice (Java): [Seleziona]
FileChannel inChannel = new FileInputStream(src).getChannel();
nel forum dove ho preso questo codice c'era scritto che era valido anche per i telefoni in cui non si hanno permessi di root.
Il problema, chiaramente, risulta essere che il db risulta non esistente; ovviamente, al posto di {package} e "nomeDatabase.db" ci sono i valori esatti (il path che viene fuori nella variabile "src" è data/data/{package}/databases/nomeDatabase.db)...immagino manchino delle istruzioni...inoltre, non so se può essere utile, ma la nuova cartella sulla sd (exampledata) viene creata,  avendo aggiunto una nuova uses permission di tipo android.permission.WRITE_EXTERNAL_STORAGE nel file AndroidManifest.xml
Qualche suggerimento?

Grazie a tutti



Update:
ho risolto...il tutto era dovuto al fatto che il database in effetti non esisteva, non essendoci stati inseriti i dati dentro...mi vergogno, ma almeno ho risolto il problema!
Grazie comunque a tutti, chiudo il topic
« Ultima modifica: 27 Dicembre 2011, 17:58:53 CET da francesco.disciascio »

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Backup database della mia app su sd: problemi
« Risposta #1 il: 27 Dicembre 2011, 18:18:01 CET »
0
[...]

data/data/{package}/databases/nomeDatabase.db)

[...]
Sicuro sia corretto? O meglio, non ricordo che vi sia una sotto cartella "data" in /data...

Ma non ti è possibile utilizzare un ContextWrapper? Per accedere direttamente ad un db potresti fare così:

Codice (Java): [Seleziona]
/* ponendo che contextBase sia il context di un'Activity o venga prelevato da getApplicationContext() */
ContextWrapper cw = new ContextWrapper(contextBase);

try {
void copyFile() throws IOException
    {
        File src = cw.getDatabasePath("nomeDatabase.db");

         /* Altro codice */
}
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Backup database della mia app su sd: problemi
« Risposta #2 il: 27 Dicembre 2011, 21:14:07 CET »
0
Quoto Ggx, ti conviene usare il suo metodo (volendo puoi accederci direttamente dal context), così sei certo che funzioni in tutte le versioni di Android.  ;-)

Offline francesco.disciascio

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Backup database della mia app su sd: problemi
« Risposta #3 il: 28 Dicembre 2011, 09:57:00 CET »
0
Ok, farò questa modifica!
Grazie per l'aiuto!
Ma se dovessi fare il contrario, ovvero importare il db nel device da sd, il metodo che mi avete suggerito non servirebbe a nulla, visto che come destinazione devo indicare una cartella e non un file...giusto?

per capirci:
Codice (Java): [Seleziona]
void copyDbOnDevice() throws IOException
    {
        File importDir = new File(Environment.getDataDirectory() + "/data/{package}/databases/");//qui posso usare getDatabasePath?

        File src = new File(Environment.getExternalStorageDirectory(), "exampledata/nomedb.db");
        if (!importDir.exists())
        {
                importDir.mkdirs();
        }
        File dst = new File(importDir, src.getName());
        FileChannel inChannel = new FileInputStream(src).getChannel();
        FileChannel outChannel = new FileOutputStream(dst).getChannel();
        try {
           inChannel.transferTo(0, inChannel.size(), outChannel);
        } finally {
           if (inChannel != null)
              inChannel.close();
           if (outChannel != null)
              outChannel.close();
        }
     }
« Ultima modifica: 28 Dicembre 2011, 10:08:32 CET da francesco.disciascio »

Offline Gigiuz

  • Utente normale
  • ***
  • Post: 187
  • Respect: +23
    • Google+
    • gigiuzzo81
    • Gigiuz81
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note III
  • Play Store ID:
    GGXSoft
  • Sistema operativo:
    Windows 7 64bit, OS X (virtualized), Ubuntu
Re:Backup database della mia app su sd: problemi
« Risposta #4 il: 29 Dicembre 2011, 00:10:40 CET »
0
Ma se dovessi fare il contrario, ovvero importare il db nel device da sd, il metodo che mi avete suggerito non servirebbe a nulla, visto che come destinazione devo indicare una cartella e non un file...giusto?

In realtà ti restituisce tutto il path mi sembra, compreso il file. D'altronde un oggetto java "File" è pur sempre un... mmm... File? :P

Per tornare al discorso database sd->dispositivo dovresti prima creare un database vuoto tramite il metodo onCreate() della classe SQLiteOpenHelper (i tutorial li trovi qui sul forum nell'apposita sezione), e poi procedere così come hai scritto tu, praticamente sovrascrivendo il db vuoto. Potresti inserire quello snippet di codice che hai scritto in coda nel metodo onCreate() sopraccitato.
Hai bisogno di implementare un sistema di "codici seriali di sblocco" nella tua applicazione? Dai un'occhiata alla mia libreria: RemoteUnlocker

Offline francesco.disciascio

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Backup database della mia app su sd: problemi
« Risposta #5 il: 29 Dicembre 2011, 10:43:22 CET »
0
In realtà ti restituisce tutto il path mi sembra, compreso il file. D'altronde un oggetto java "File" è pur sempre un... mmm... File? :P

Per tornare al discorso database sd->dispositivo dovresti prima creare un database vuoto tramite il metodo onCreate() della classe SQLiteOpenHelper (i tutorial li trovi qui sul forum nell'apposita sezione), e poi procedere così come hai scritto tu, praticamente sovrascrivendo il db vuoto. Potresti inserire quello snippet di codice che hai scritto in coda nel metodo onCreate() sopraccitato.

Quindi, se ho afferrato, creo il db vuoto, poi chiamo il metodo per trovare il percorso completo. Ok.
Ad ogni modo, prima ancora di modificare la parte relativa alla ricerca del path, ho provato ad importare il db nel dispositivo e il tutto ha funzionato; premetto che ho cancellato i dati dell'applicazione nella apposita sezione del gestore delle applicazioni.

Ad ogni modo, i vostri consigli sono stati molto utili per stimolarmi a migliorare il mio codice. Grazie a tutti