Autore Topic: Backup nella SD e Restore dalla SD del Database della vostra app  (Letto 3854 volte)

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Backup nella SD e Restore dalla SD del Database della vostra app
« il: 28 Settembre 2013, 12:35:58 CEST »
+2
Ciao a tutti,

seguendo tutorial in Android Dev sono riuscito a creare e usare facilmente il database nelle mia app.

fonti:
[medio] Creazione e utilizzo di un database SQLite - Android Developers Italia
[medio] Backup di un database SQLite su sdcard. - Android Developers Italia


Avevo però la necessià di fare un backup e ripristinarlo.
Sperando di fare cosa gradita di seguito vi metto a disposizione i 2 metodi che ho utilizzato (do per scontato che abbiate letto i 2 tutorial sopra elencati e che sappiate già come fare il vostro db).


Questa è la classe che avete creato per la gestione del vostro db seguendo il primo tutoria:
Codice (Java): [Seleziona]
      private class DbHelper extends SQLiteOpenHelper {
       .....
       }      

Backup:
Codice (Java): [Seleziona]
                dbHandler = new DbHelper(context);
                dbHandler.open();
                String dbPath = dbHandler.getPath();
                dbHandler.close();
                String backupPath = Environment.getExternalStorageDirectory().getPath() + "/" + "MYAPPFOLDER" + "/" + "BACKUP_FOLDER";
                String backupFileName = "MyFirstBackup";

                try {

                        File backupDirectory = new File(backupPath);
                        if (!backupDirectory.exists()) {
                                backupDirectory.mkdirs();
                        }

                        if (backupDirectory.canWrite()) {
                                File currentDB = new File(dbPath);
                                File backupDB = new File(backupDirectory, backupFileName);

                                FileInputStream fis = new FileInputStream(currentDB);
                                OutputStream output = new FileOutputStream(backupDB);

                                // Transfer bytes from the inputfile to the outputfile
                                byte[] buffer = new byte[1024];
                                int length;
                                while (( length = fis.read(buffer) ) > 0) {
                                        output.write(buffer, 0, length);
                                }

                                // Close the streams
                                output.flush();
                                output.close();
                                fis.close();

                                return backupDB.toString();
                        }
                        else {
                                Log.e("BackupHandler", "Can't write to SD card, add permission");
                                return null;
                        }
              }
                catch (Exception e) {
                        e.printStackTrace();
                        return null;
                }

Restore:
Codice (Java): [Seleziona]
               
                File backupFile = new File("qui dovrete passare il path di dove si trova il vostro backup");
                dbHandler = new DbHelper(context);
                dbHandler.open();
                String dbPath = dbHandler.getPath();
                dbHandler.close();

                try {
                        if (!backupFile.exists()) {
                                return false;
                        }

                        File currentDB = new File(dbPath);
                        File backupDB = backupFile;

                        FileInputStream fis = new FileInputStream(backupDB);
                        OutputStream output = new FileOutputStream(currentDB);

                        // Transfer bytes from the inputfile to the outputfile
                        byte[] buffer = new byte[1024];
                        int length;
                        while (( length = fis.read(buffer) ) > 0) {
                                output.write(buffer, 0, length);
                        }

                        // Close the streams
                        output.flush();
                        output.close();
                        fis.close();

                        return true;

                }
                catch (Exception e) {
                        e.printStackTrace();
                        return false;
                }
        }
« Ultima modifica: 28 Settembre 2013, 12:41:09 CEST da lucab »
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline paul78

  • Utente normale
  • ***
  • Post: 359
  • Respect: +1
    • Mostra profilo
    • Android Code
  • Sistema operativo:
    Linux - Windows
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #1 il: 30 Settembre 2013, 10:05:58 CEST »
0
lo proverò subito!!!
tutti possiamo programmare...basta volerlo!!!

Offline CrotaNexus

  • Utente normale
  • ***
  • Post: 156
  • Vuolsi così colà dove si puote ciò che si vuole
  • Respect: +25
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    SimoneDev
  • Sistema operativo:
    Windows 8.1
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #2 il: 25 Giugno 2014, 14:19:18 CEST »
0
Grandissimo tutorial! Appena usato. Funziona alla perfezione. Thanks meritato!  ;)
SimoneDev @ Google Play Store

Offline Illogica

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +4
    • Google+
    • Mostra profilo
    • Illogica Software
  • Dispositivo Android:
    Caterpillar B15Q / Asus Padfone Infinity / Htc Pyramid / Samsung Galaxy *
  • Play Store ID:
    Illogica Software
  • Sistema operativo:
    Ubuntu 14.04
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #3 il: 23 Settembre 2014, 14:55:55 CEST »
0
Occhio che con Android 4.4 e seguenti questo snippet non dovrebbe dare i risultati sperati. Di solito si salva su SD per mantenere i dati anche dopo la disinstallazione dell'app. Da KitKat le app non possono scrivere sulla SD, ogni dato viene salvato sulla memoria interna del telefono in una cartella legata all'app. Quindi, questo metodo funziona ma se si usa Android 4.4 i dati non persistono dopo la disinstallazione dell'app.

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #4 il: 23 Settembre 2014, 22:41:37 CEST »
0
Occhio che con Android 4.4 e seguenti questo snippet non dovrebbe dare i risultati sperati. Di solito si salva su SD per mantenere i dati anche dopo la disinstallazione dell'app. Da KitKat le app non possono scrivere sulla SD, ogni dato viene salvato sulla memoria interna del telefono in una cartella legata all'app. Quindi, questo metodo funziona ma se si usa Android 4.4 i dati non persistono dopo la disinstallazione dell'app.

Ciao Illogica,
Che io sappia su Android 4.4 si può ancora scrivere su SD. Ho diverse app installate che sulla sd salvano immagini e altri tipi di dati e su Android 4.4.4 le cartelle rimangono anche dopo la disinstallazione , infatti ogni tanto vado a dare una pulita manualmente alla SD ;)
Alcuni i telefoni nuovi che non hanno SD (ad esempio nexus 4 o 5) hanno comunque una SD emulata e è possibile salvarvi file da un app!

Venendo allo snippet lo uso su diverse app e la cartella
Codice (Java): [Seleziona]
Environment.getExternalStorageDirectory().getPath() + "/" + "MYAPPFOLDER" + "/" + "BACKUP_FOLDER"rimane anche dopo la disinstallazione. Al posto di MYFOLDER puoi mettere qualsiasi cartella tu voglia, e questa non viene cancellata. ;)

Non saprei se c'è qualche cartella particolare nella SD che viene cancellata al momento della disinstallazione, se così fosse sarebbe interessante perchè si potrebbero mettere li i file che non si vogliono salvare. Magari qualcuno sa se c'è una cartella simile e ci può illuminare ;)
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline Illogica

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +4
    • Google+
    • Mostra profilo
    • Illogica Software
  • Dispositivo Android:
    Caterpillar B15Q / Asus Padfone Infinity / Htc Pyramid / Samsung Galaxy *
  • Play Store ID:
    Illogica Software
  • Sistema operativo:
    Ubuntu 14.04
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #5 il: 24 Settembre 2014, 08:07:55 CEST »
0
E' una buona notizia che sul tuo dispositivo funzioni questo sistema.
Per quanto mi riguarda, su 4.4.2 non sono ancora riuscito a farlo funzionare: si, ti viene proposta una SD emulata e no, i dati non mi rimangono dopo la disinstallazione dell'app.
La linea ufficiale di Android per KitKat è di limitare la scrittura sugli external storage (quindi SD, USB-otg, varie ed eventuali): https://groups.google.com/forum/#!msg/android-platform/14VUiIgwUjY/UsxMYwu02z0J

Poi se col passare del tempo ritornano sui loro passi... boh, intanto hanno comunque messo un po' di bastoni tra le ruote  ;-)

Offline lucab

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: +10
    • Mostra profilo
    • Lucabportal
  • Dispositivo Android:
    Nexus 5 - Nexus One
  • Play Store ID:
    Luca Biasotto
  • Sistema operativo:
    Mac OS X
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #6 il: 24 Settembre 2014, 08:51:05 CEST »
0
E' vero hai ragione, mea culpa non me ne ero accorto, ne parlano qui: External Storage Technical Information | Android Developers

Resta un mistero del perchè continui a funzionarmi nel nexus 5 con androind 4.4.4 ufficiale (senza root ecc ecc ma con SD emulata), poi provo anche su s4 con SD fisica, vediamo li che succede.

Dovremmo salvare i file delle nostre app su Drive per essere sicuri non vengano eliminati :D è una bella seccatura questa cosa!
Le occasioni arrivano una volta sola, se non le afferri al volo passeranno altri alla storia.

Offline Blodhgard

  • Utente junior
  • **
  • Post: 53
  • Respect: +3
    • Mostra profilo
    • Budget Veloce
  • Dispositivo Android:
    Nexus 5, S4 mini, Galaxy Tab S
  • Play Store ID:
    blodhgard
  • Sistema operativo:
    Windows 8.1
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #7 il: 15 Ottobre 2014, 20:51:18 CEST »
0
Dopo aver letto questa discussione ho provato sul mio S5 con android 4.4.2 e disistallando l'app il backup resta.

Offline scemodicecosa

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Backup nella SD e Restore dalla SD del Database della vostra app
« Risposta #8 il: 12 Febbraio 2015, 15:25:56 CET »
0
Ciao, ho provato ad utilizzare il tuo codice su un nexus4 con lollipop ma nel logcat mi da un errore failed to chmod (posizione database in data/data) ERPM Operation not permitted. Sapete darmi una mano?
Grazie

EDIT: Ho risolto, mancavano i permessi di lettura su sd  :-P
« Ultima modifica: 12 Febbraio 2015, 15:43:35 CET da scemodicecosa »