我允许用户创建多个SharedPreferences
文件,但同时也希望他们可以选择删除这些文件。我知道我可以使用内部存储,但这不是我的问题。
我的问题是:“我如何在代码或手动方式下删除一个SharedPreferences
文件?(不只是清除其内容)”
我允许用户创建多个SharedPreferences
文件,但同时也希望他们可以选择删除这些文件。我知道我可以使用内部存储,但这不是我的问题。
我的问题是:“我如何在代码或手动方式下删除一个SharedPreferences
文件?(不只是清除其内容)”
如果您通过Context.getSharedPreferences("X")
获取SharedPreferences
实例,则您的文件将命名为X.xml
。
它将位于/data/data/com.your.package.name/shared_prefs/X.xml
。 您可以从该位置删除该文件。 还要检查/data/data/com.your.package.name/shared_prefs/X.bak
文件,如果存在,请也将其删除。
但请注意,SharedPreferences
实例将所有数据保存在内存中。 因此,您需要先清除首选项,提交更改,然后再删除首选项备份文件。
这应该足以实现您的设计决策。
File file= new File("/data/data/.../shared_prefs/X.xml");
然后 file.delete();
- inazarukcontext.getFilesDir().getParent() + File.separator + "shared_prefs"
(文件目录是 shared_prefs 目录的同级目录)。 - arlomedia这里有一个简单的方法可以清除给定上下文的所有SharedPreferences,适用于单元测试。
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 preference file
ctx.getSharedPreferences(children[i].replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
//delete the file
new File(dir, children[i]).delete();
}
}
请注意,当您在使用此功能进行 Android 单元测试并在您的 Application
类中使用 sharedpreferences 时,可能会导致竞争条件并且可能无法正常工作。
Java:
public static boolean deleteSharedPreferences(Context context, String name) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.deleteSharedPreferences(name);
} else {
context.getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply();
File dir = new File(context.getApplicationInfo().dataDir, "shared_prefs");
return new File(dir, name + ".xml").delete();
}
}
Kotlin:
companion object {
fun deleteSharedPreferences(context: Context, name: String): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return context.deleteSharedPreferences(name)
} else {
context.getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply()
val dir = File(context.applicationInfo.dataDir, "shared_prefs")
return File(dir, "$name.xml").delete()
}
}
}
apply()
,它可能会导致竞态条件。请改用commit()
。 - Mohit Atrayif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.deleteSharedPreferences(preferencesKey);
} else {
try {
org.apache.commons.io.FileUtils.cleanDirectory(new File(context.getCacheDir().getParent() + "/shared_prefs/"));
} catch (IOException e) {
Log.e(TAG, "Cannot delete files in shared pref directory", e);
}
}
FileUtils
是什么? - azizbekianFileUtils
是 Apache Commons IO 库中的实用工具类。可以通过 implementation 'commons-io:commons-io:2.6'
引入该库。 - hasnain_ahmad这很简单!
您的默认SD卡偏好设置XML文件路径可能是:/data/data/您的包名/shared_prefs/您的共享偏好设置XML文件。
例如:/data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml。
删除偏好设置XML文件:
File deletePrefFile = new File("/data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml");
deletePrefFile.delete();
或者像这样获取文件路径字符串,
String filePath = getApplicationContext().getFilesDir().getParent()+"/shared_prefs/swipe_preferences.xml";
File deletePrefFile = new File(filePath );
deletePrefFile.delete();
clear()
会清空文件,但不会从文件系统中删除文件。一个设计不良的应用程序(像我的)可能会导致许多空文件占用空间。@kirill和@inazaruk的方法似乎适合我。 - Richard Le Mesurier