2011-11-15 7 views
0

Je suis désolé pour une question plutôt verte, mais je ne pouvais pas encore trouver de solution. Je tente de restaurer une base de données à partir d'une sauvegarde sur carte SD. Le code suivant (une légère version modifiée de celle fournie ici SO)comment copier la base de données de la carte SD à la base de données

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

    if (sd.canWrite()) { 
     String currentDBPath = 
      "\\data\\com.dg\\databases\\" + com.dg.Constants.db_Table; 
     String backupDBPath = "com.dg"; 
     File currentDB = new File(data, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

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

Lancers NonWriteableChannelException même si le fichier de base de données n'est pas ouvert.

Répondre

0

Vos données sont généralement

/data/data/com.dg/databases

Vous devez vous débarrasser de la double \ dans le chemin.

En outre, vous utilisez Environment.getDataDirectory() comme répertoire parent, puis "\ data \ com.dg \ databases \" (etc) comme nom de fichier. C'est totalement faux.

La méthode la plus simple est "getDatabasePath" dans Context (ou Activity). Donnez-lui le nom de votre base de données et il devrait vous donner une référence de fichier. Cependant, je ne sais pas ce que cela ferait si ce fichier n'existait pas encore.

http://developer.android.com/reference/android/content/Context.html#getDatabasePath(java.lang.String)

Vous pouvez également essayer simple 'GETDIR ("bases de données", MODE_PRIVATE)'. Cela devrait retourner le répertoire de la base de données.

essayer final pour la base de données dir, vraiment sale:

File dbDir = new File(getFilesDir().getParentFile(), "databases"); 
+0

Merci pour votre réponse. Les répertoires sont définitivement OK - j'ai été en mesure de faire la sauvegarde avec le code presque identique en premier lieu. (La chaîne "\\" apparaît comme \ dans la sortie finale) – user1008771

+0

Si vous ne pouvez pas lire/écrire le fichier, ils ne sont pas OK. Vous êtes sur un système Unix, donc les barres obliques inverses sont erronées. Ils pourraient fonctionner dans certains cas, mais ce serait seulement parce que Java compense votre erreur. Sérieusement. Sous Linux, barres obliques Maintenant, l'objet File dans Java, le formulaire que vous utilisez, prend deux paramètres. Un répertoire qui est votre répertoire parent et un nom de fichier. Vous passez un répertoire (le mauvais) et un répertoire mal formaté en tant que nom de fichier. Essayez le nouveau fichier ("/ data/data/[votre paquet]/bases de données/[votre fichier db]"). Cette forme prend un chemin complet en tant que chaîne. –

+0

Merci, cela fait beaucoup de sens. Cependant, le problème persiste. La copie vers un autre emplacement de ce répertoire (c'est-à-dire /data/data/com.dg/databases/fakeDB) est réussie, mais pas le fichier DB lui-même. Cela a lieu avant la première ouverture de DB (activité splash) – user1008771

0

Est-ce que votre utilisateur/app ont des autorisations pour // base de données? (Sinon, CECI EST LA RÉPONSE.)

Peut-être que cela pourrait vous dire pourquoi la permission est refusée:

IOException: Permission Denied

Bill Mote (à partir du lien ci-dessus) ont également souligné le paramètre d'autorisation suivant :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Mon utilisateur n'est pas root et je n'ai pas déclaré d'autorisation (sauf pour le stockage externe en écriture), bien que je n'ai pas trouvé d'autorisation spéciale "accès à la base de données". Savez-vous quelle permission devrais-je déclarer? Le DB fonctionne bien, sauf pour la copie thingy – user1008771

+0

Voir la réponse ci-dessus. Si le SD était déjà monté, il devient "en lecture seule" pour Android. – Joshua

+0

Le code fourni est obligatoire pour effectuer la sauvegarde, mais pas pour récupérer la base de données. J'ai des problèmes pour remplacer le fichier sur la mémoire interne avec la version de la carte SD – user1008771

Questions connexes