我允许用户创建多个SharedPreferences
文件,但我也希望他们选择删除这些文件。我知道我可以使用内部存储,但这不是我的问题。删除SharedPreferences文件
我的问题是:“我如何删除(不只是清除)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
实例将所有数据保存在内存中。因此,您需要首先清除首选项,提交更改并仅删除首选项备份文件。
这应该足以实现您的设计决策。
哦,所以即使我刚删除文件而未先清除数据,数据仍会占用内存?另外,你能否指点我一个教程或一些显示如何进入目录并删除文件的东西。谢谢 – Andrew 2011-05-25 13:52:41
是的,它可能会将数据保存在内存中一段时间。它可能会检测到该文件已被删除并自行清除,但我不建议依赖该文件。至于删除文件见文档:http:它非常简单:'File file = new File(“/ data/data /.../ shared_prefs/X.xml”);'然后'file.delete();' – inazaruk 2011-05-25 13:56:43
哦,太棒了,很简单。谢谢 。 – Andrew 2011-05-25 15:23:18
下面是一个简单的方法来清除给定环境下的所有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 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();
}
}
注意,使用您正在使用的时候是Android单元测试。并且您在类Application
中使用共享首选项,这可能会导致竞争条件,并且可能无法正常工作。
到目前为止发现的最佳答案 – 2016-05-23 17:23:05
其简单的天才!
您的默认sd卡preference.xml文件路径可能是:/data/data /您的软件包名称/ shared_prefs /您的共享首选项xml文件。
like,/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();
第二种选择是错误的。 getApplicationContext()。getFilesDir()。getPath()+“/”+“shared_prefs /引向/ data/data.html/home/files/。第二个选项为Downvote。 – goseib 2015-03-22 19:05:35
第二个选项错误。getApplicationContext()。getFilesDir()。getPath()+“/”+“shared_prefs/leads to /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/ swipe_preferences.xml !!! shared_prefs文件夹不在文件文件夹下。用getParent()替换getPath()。因为你不友好的态度而下降! – goseib 2015-03-22 19:33:45
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);
}
}
你尝试了明确的()方法。我认为这实际上意味着删除存储在共享首选项中的所有值。所以一旦你提供给你的用户将被提供共享首选项的默认值。 – 2011-05-25 13:38:39
'clear()'将清除文件,但不会从文件系统中删除文件。设计不佳的应用程序(像我的)可能会以许多空文件结束,占用空间。 @ kirill's&@ inazaruk的方法似乎适用于我。 – 2013-07-16 21:17:36