61 votes

Comment sauvegarder un fichier de base de données sur la carte SD sous Android ?

J'aimerais ajouter une fonctionnalité à mon application Android qui sauvegarde automatiquement les SQLite à la base de données Carte SD .

Quelle est la meilleure façon de procéder ? Y a-t-il des exemples ou des didacticiels disponibles ?

1 votes

Notez que si elle se trouve sur la carte SD, elle ne sera plus privée pour votre application.

4 votes

@Mirko N : Je sais, mais les gens veulent une copie de sauvegarde pour des choses comme une réinstallation, un téléphone endommagé, des choses comme ça.

123voto

skeniver Points 1032

Ce code fonctionne pour moi !

    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath = "//data//{package name}//databases//{database name}";
            String backupDBPath = "{database name}";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
    }

Quelqu'un sait-il si cela fonctionne sur les téléphones non-Root ? Je ne l'ai essayé que sur un G1 rooté.

19 votes

Je peux confirmer que cela fonctionne sur les téléphones non enracinés. Assurez-vous juste d'ajouter <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></u‌​ses-permission>

0 votes

CurrentDB.exists() returnign false.... peut être que la base de données n'est pas présente dans la mémoire du système mais j'ai réussi à insérer les lignes...et je récupère le chemin par String currentDBPath = db.getPath() ;

10 votes

J'utilise File currentDB = getDatabasePath(DatabaseHelper.DATABASE_NAME) ; plutôt qu'une référence statique.

21voto

Rhys Points 159
try {
    File sd = Environment.getExternalStorageDirectory();
    File data = Environment.getDataDirectory();

    if (sd.canWrite()) {
        String currentDBPath = "//data//"+ packageName +"//databases//"+dbList[0];
        String backupDBPath = dbList[0];
        File currentDB = new File(data, currentDBPath);
        File backupDB = new File(sd, backupDBPath);

        FileChannel src = new FileInputStream(currentDB).getChannel();
        FileChannel dst = new FileOutputStream(backupDB).getChannel();
        dst.transferFrom(src, 0, src.size());
        src.close();
        dst.close();
        Toast.makeText(getBaseContext(), backupDB.toString(), Toast.LENGTH_LONG).show();
    }
} catch (Exception e) {
    Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
}

Cela fonctionne contrairement aux exemples ci-dessus dans lesquels les "/" sont des "\". J'ai perdu 20 minutes de ma vie à comprendre cela, mais j'aurais vraiment dû le voir plus tôt. Le site Toast vous indiquera où le fichier a été placé ou vous dira ce qui ne va pas lorsque cela ne fonctionne pas.

1 votes

Iif(sd.canWrite()) n'a pas fonctionné pour moi. A la place, j'ai utilisé if (Environment.MEDIA_MOUNTED.equals(state)) {

10voto

Christopher Orr Points 58514

Les bases de données SQLite sont des fichiers complètement autonomes et sont portables - vous pouvez simplement copier le fichier entier directement sur la carte SD.

Je vérifierais d'abord si une carte SD est installée dans l'appareil et quel est son chemin d'accès (en utilisant la commande Environment.getExternalStorageDirectory() ).

3voto

Austyn Mahoney Points 4252

I répondu à une question similaire à celle-ci avec une méthode que vous pouvez placer dans votre SQLiteOpenHelper . Il suffit de copier le fichier db d'une sorte de stockage externe vers le stockage interne de l'application. Il y a aussi du code supplémentaire qui ouvre et lit le fichier db pour s'assurer qu'il est dans l'état approprié pour qu'Android puisse y faire des appels de base de données.

0 votes

J'ai vu votre exemple et il semble concis, comme trop concis. C'est difficile pour moi de comprendre comment l'adapter à mon code. Je ne sais pas qui a le code le plus efficace, tout ce que je sais c'est que la logique/code supplémentaire ou le code trop simplifié le rend plus difficile à comprendre et à adapter à mon code. La plupart des gens créent 4 "FILE" distincts, alors que le vôtre n'en crée que 2. Pourquoi ce sujet particulier est-il si confus ?

1voto

Drakosha Points 6360

Il y a un code pour exportation de la base de données sqlite en xml sur la carte sd . Peut-être que c'est assez bien ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X