2011-05-25 15 views
13

Permitir al usuario crear varios archivos SharedPreferences, pero también me gustaría la opción de que eliminen estos archivos. Sé que podría usar el almacenamiento interno, pero esa no es mi pregunta.Eliminar archivo de preferencias compartidas

Mi pregunta es: "¿Cómo puedo eliminar (no solo borrar) un archivo SharedPreferences?"

+2

¿Usted intentó el método clear(). Creo que en realidad está destinado a eliminar todos los valores almacenados en la preferencia compartida. Por lo tanto, una vez que proporcione, a sus usuarios se les proporcionará el valor predeterminado de la preferencia compartida. –

+1

'clear()' borrará el archivo, pero no eliminará el archivo del sistema de archivos. Una aplicación mal diseñada (como la mía) podría terminar con muchos archivos vacíos, ocupando espacio. El método de @ kirill's & @ inazaruk parece funcionar para mí. –

Respuesta

30

Si obtiene SharedPreferences instancia a través de Context.getSharedPreferences("X"), su archivo se llamará X.xml.

Se encontrará en /data/data/com.your.package.name/shared_prefs/X.xml. Puede simplemente eliminar ese archivo de la ubicación. También verifique el archivo /data/data/com.your.package.name/shared_prefs/X.bak, y si existe, elimínelo también.

Pero tenga en cuenta que la instancia SharedPreferences guarda todos los datos en la memoria. Por lo tanto, primero deberá borrar las preferencias, confirmar los cambios y solo luego eliminar el archivo de respaldo de preferencias.

Esto debería ser suficiente para implementar su decisión de diseño.

+0

Oh, ¿si acabo de eliminar el archivo sin borrarlo primero, los datos seguirían ocupando memoria? Además, ¿podría indicarme un tutorial o algo que muestre cómo ingresar en un directorio y eliminar un archivo? gracias – Andrew

+5

Sí, podría mantener los datos en la memoria durante algún tiempo. Puede detectar que el archivo fue eliminado y borrarse, pero no recomendaría confiar en eso. En cuanto a la eliminación de archivos, consulte la documentación: http://developer.android.com/reference/java/io/File.html#File%28java.lang.String%29. Es bastante fácil: 'File file = new File ("/data/data /.../ shared_prefs/X.xml ");' y luego 'file.delete();' – inazaruk

+0

Oh genial, eso es simple. gracias . – Andrew

17

Aquí es un método fácil para borrar todos los SharedPreferences para un contexto dado, útil para unidad de pruebas

public static void clearSharedPreferences(Context ctx){ 
    File dir = new File(ctx.getFilesDir().getParent() + "/shared_prefs/"); 
    String[] children = dir.list(); 
    for (int i = 0; i < children.length; i++) { 
     // clear each of the prefrances 
     ctx.getSharedPreferences(children[i].replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit(); 
    } 
    // Make sure it has enough time to save all the commited changes 
    try { Thread.sleep(1000); } catch (InterruptedException e) {} 
    for (int i = 0; i < children.length; i++) { 
     // delete the files 
     new File(dir, children[i]).delete(); 
    } 
} 

nota que cuando se utiliza está utilizando es para comprobar Unidad Android. y usa las preferencias compartidas en su clase Application, esto puede causar una condición de carrera y es posible que no funcione correctamente.

+1

La mejor respuesta que encontré hasta ahora –

2

¡Es simple Genius!

La ruta predeterminada del archivo sd card preference.xml podría ser: /data/data/your package name/shared_prefs/your shared preference xml file.

como, /data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml.

de borrar el archivo de preferencias xml:

File deletePrefFile = new File("/data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml"); 
deletePrefFile.delete(); 

O obtener la ruta de archivo en cadena como,

String filePath = getApplicationContext().getFilesDir().getParent()+"/shared_prefs/swipe_preferences.xml"; 
File deletePrefFile = new File(filePath); 
deletePrefFile.delete(); 
+0

La segunda opción es incorrecta. getApplicationContext(). getFilesDir(). getPath() + "/" + "shared_prefs/conduce a /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/swipe_preferences.xml !!! La carpeta shared_prefs no está en la carpeta de archivos . Downvote para la segunda opción. – goseib

+0

La segunda opción es incorrecta. GetApplicationContext(). GetFilesDir(). GetPath() + "/" + "shared_prefs/conduce a /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/ swipe_preferences.xml !!! La carpeta shared_prefs no está en la carpeta de archivos. Reemplace el getPath() con getParent(). Downvote debido a su actitud antipática! – goseib

3
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
     context.deleteSharedPreferences(preferencesKey); 
} else { 
    try { 
     FileUtils.cleanDirectory(new File(context.getCacheDir().getParent() + "/shared_prefs/")); 
    } catch (IOException e) { 
     Log.e(TAG, "Cannot delete files in shared pref directory", e); 
    } 
} 
Cuestiones relacionadas