我允许用户创建多个
SharedPreferences
文件,但我也希望他们可以选择删除这些文件。我知道我可以使用内部存储,但这不是我的问题。
我的问题是:“如何在代码中或手动删除(不仅仅是清除)
SharedPreferences
文件?”
如果您通过
SharedPreferences
获得 Context.getSharedPreferences("X")
实例,那么您的文件将被命名为 X.xml
。
它将位于
/data/data/com.your.package.name/shared_prefs/X.xml
。您只需从该位置删除该文件即可。同时检查 /data/data/com.your.package.name/shared_prefs/X.bak
文件,如果存在,也将其删除。
但请注意,
SharedPreferences
实例将所有数据保存在内存中。因此,您需要首先清除首选项,提交更改,然后才删除首选项支持文件。
这应该足以实现您的设计决策。
这是一个简单的方法来清除给定上下文的所有 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
类中使用共享首选项时,这可能会导致竞争条件,并且可能无法正常工作。
if (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);
}
}
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();
}
}
科特林:
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()
}
}
}
这就是简单的天才!
您的默认 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();
我发现(在 Android 12 中,原始问题发生多年后),如果我在某些代码编辑首选项值后不久删除共享首选项文件,则应用新的首选项可能要等到我删除该文件后才能完成,此时 Android将重新创建文件,并保留所有先前的值。
当我按照 @inazaruk 的建议在删除文件之前清除首选项时,也会发生这种情况,因为我在那里使用了 apply() 。如果我使用 commit() 代替,也许不会造成问题,但我发现在我的情况下不需要清除首选项。