2011-11-29 6 views
1

J'essaie de créer une fonctionnalité de réinitialisation de l'application pour mon application et j'essaie de supprimer tous les fichiers du stockage interne, notamment files folder, databases folder et shared preferences. Le problème est que ce n'est pas à chaque fois que j'essaie de supprimer ces dossiers, ils sont supprimés. Parfois, la fonction que j'utilise pour supprimer les fichiers renvoie false. Dans ce cas, mon application ne peut pas fonctionner correctement. Voici ce que j'utilise:Supprimer le stockage interne du dossier des bases de données

@SuppressWarnings("static-access") 
public void deleteAllData(){ 

    String cache = this.getCacheDir().toString(); 
    Log.e("","dbPath : "+cache); 
    File ChFolder = new File(cache); 
    boolean cachee = deleteDirectory(ChFolder); 
    Log.e("","Database Folder Delete Success : "+cachee); 

    String server = rpc.getCurrentServerName(this); 
    int userId = rpc.getUserId(this); 

    String userDbPath = "/data/data/"+this.getPackageName()+"/databases/"+Integer.toString(userId)+"_"+server; 
    File userDbFile = new File(userDbPath); 
    boolean userDbFileTF = userDbFile.delete(); 
    Log.e("","user Database Folder : "+userDbFileTF); 

    String sysDbPath = "/data/data/"+this.getPackageName()+"/databases/stampii_sys_tpl.sqlite"; 
    File sysDbFile = new File(sysDbPath); 
    boolean sysDbFileTF = sysDbFile.delete(); 
    Log.e("","user Database Folder : "+sysDbFileTF); 

    // Delete Databases Folder : 
    String dbPath = "/data/data/"+this.getPackageName()+"/databases/"; 
    Log.e("","dbPath : "+dbPath); 
    File dbFolder = new File(dbPath); 
    boolean dbFold = deleteDirectory(dbFolder); 
    Log.e("","Database Folder Delete Success : "+dbFold); 


    // Delete Files Folder : 
    String name = this.getFilesDir().toString()+"https://stackoverflow.com/users/"; 
    Log.e("","path : "+name); 
    File files = new File(name); 
    boolean filesFol = deleteDirectory(files); 
    Log.e("","filesFol : "+filesFol); 

} 

static public boolean deleteDirectory(File path) { 
    if(path.exists()) { 
     File[] files = path.listFiles(); 
     if (files == null) { 
      return true; 
     } 
     for(int i=0; i<files.length; i++) { 
     if(files[i].isDirectory()) { 
      deleteDirectory(files[i]); 
     } 
     else { 
      files[i].delete(); 
     } 
     } 
    } 
    return(path.delete()); 
} 

Y at-il quelque chose que je manque et comment puis-je mettre en œuvre la fonction comme Clear Data dans les paramètres Android qui supprimera les bases de données aussi.

Répondre

1

Un répertoire doit être vide pour être supprimé. Voici un exemple de suppression de fichiers d'un répertoire, puis suppression du répertoire lui-même.

http://www.rgagnon.com/javadetails/java-0483.html

+0

Si vous regardez ma fonction 'deleteDirectory()', j'utilise la même méthode. –

+1

Alors vous êtes ... pourquoi ne pas vous connecter le répertoire que vous essayez de supprimer, et c'est le contenu. Ensuite, consignez les fichiers lorsque vous les supprimez pour vous assurer que la méthode fonctionne et déterminez si le répertoire est réellement vide lorsque vous essayez de le supprimer. – Craigy

+0

En fait, je fais ça et ça retourne faux quand j'essaye de les supprimer, pas toujours mais parfois. Et je n'arrive pas à comprendre pourquoi ça ne marche pas, parce que je ne fais rien de spécial. –

2

Utilisez le code suivant. Il devrait supprimer toutes les données automatiquement. Assurez-vous qu'aucune base de données/fichier ou aucune ressource de cache n'est utilisée avant de poursuivre:

/** 
* Call this method to delete any cache created by app 
* @param context context for your application 
*/ 
public static void clearApplicationData(Context context) { 
    Log.i("delete", "Clearing app cache"); 

    File cache = context.getCacheDir(); 
    File appDir = new File(cache.getParent()); 
    if (appDir.exists()) { 
     String[] children = appDir.list(); 
     for (String s : children) { 
      File f = new File(appDir, s); 
      if(deleteDir(f)) 
       Log.i("delete", String.format("*** DELETED -> (%s) ***", 
        f.getAbsolutePath())); 
     } 
    } 
} 

private static boolean deleteDir(File dir) { 
    if (dir != null && dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i = 0; i < children.length; i++) { 
      boolean success = deleteDir(new File(dir, children[i])); 
      if (!success) { 
       return false; 
      } 
     } 
    } 
    return dir.delete(); 
} 
Questions connexes