2011-08-22 3 views
2

J'essaie de copier un fichier db android de mon dossier d'application à un autre sur la carte SD. Et à partir de l'explorateur de fichiers DDMS, je peux remarquer que la taille du fichier copié est 0. Ceci est mon code ci-dessous.Le fichier db android copié est vide

public boolean copyDBFile(){ 
    File dbFile =new File(Environment.getDataDirectory() + DB_PATH); 
    File exportDir = new File(Environment.getExternalStorageDirectory() 
     + "/BACKUP_DIR"); 
    if (!exportDir.exists()) { 
     exportDir.mkdirs(); 
    } 

    File file = new File(exportDir, dbFile.getName()); 
    try { 
     file.createNewFile();   
     copyFile(dbFile, file); 
     return true; 
    } catch (IOException e) {  
     return false; 
    } 
} 


public void copyFile(File src, File dst) throws IOException { 
    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(); 
    } 
} 

Est-ce un problème de permission? Merci pour l'aide.

+3

Vous devriez * toujours * avoir une instruction catch pour chaque instruction try, sinon vous ne pouvez pas dire si une exception se produit. Ici, ajoutez une capture à votre essai dans copyFile. – Snicolas

+0

pouvez-vous expliquer que plus plz? Je pense qu'il ne veut pas attraper l'exception mais simplement fermer les canaux pour éviter les fuites. voulez-vous dire qu'il est automatiquement pris? si oui alors je pense que vous avez résolu le problème :) – MozenRath

+0

Le fichier db n'est pas copié. Juste un fichier de taille 0 avec le même nom. On dirait que le fichier est créé mais jamais copié. –

Répondre

1

@piyush Merci pour l'essai/avis de capture. J'ai trouvé l'erreur après avoir ajouté une trace de journal dans la méthode boolean copyDBFile() au bloc catch.

public boolean copyDBFile(){ 
File dbFile =new File(Environment.getDataDirectory() + DB_PATH); 
File exportDir = new File(Environment.getExternalStorageDirectory() 
    + "/BACKUP_DIR"); 
if (!exportDir.exists()) { 
    exportDir.mkdirs(); 
} 

File file = new File(exportDir, dbFile.getName()); 
try { 
    file.createNewFile();   
    copyFile(dbFile, file); 
    return true; 
} catch (IOException e) { 
    Log.e("Sarelo", "Error creating file", e); 
    return false; 
} 

}

Mon DB_PATH était déjà mis à /data/data/package/databases/data.db et ajouté à Environment.getDataDirectory() le résultat dbFile-/data/data/data/package/databases/data.db C'est la grosse erreur! Merci à tous pour votre aide :)

+0

aaargh! :) votre bienvenue et s'il vous plaît voter jusqu'à la réponse et commentaires plz :) – MozenRath

0

essayez d'utiliser outChannel.force(true); avant d'utiliser le transferTo(...);

+0

:(Toujours pas de travail, la taille du fichier db est toujours 0. –

+2

avez-vous essayé d'ajouter un bloc catch et de lancer une exception? Essayez simplement de voir si une exception est levée mais pas affichée à cause du bloc catch – MozenRath

+0

pouvez-vous montrer votre code après avoir ajouté le bloc de capture? – MozenRath