2011-05-25 115 views
13

我允许用户创建多个SharedPreferences文件,但我也希望他们选择删除这些文件。我知道我可以使用内部存储,但这不是我的问题。删除SharedPreferences文件

我的问题是:“我如何删除(不只是清除)SharedPreferences文件?”

+2

你尝试了明确的()方法。我认为这实际上意味着删除存储在共享首选项中的所有值。所以一旦你提供给你的用户将被提供共享首选项的默认值。 – 2011-05-25 13:38:39

+1

'clear()'将清除文件,但不会从文件系统中删除文件。设计不佳的应用程序(像我的)可能会以许多空文件结束,占用空间。 @ kirill's&@ inazaruk的方法似乎适用于我。 – 2013-07-16 21:17:36

回答

30

如果您通过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实例将所有数据保存在内存中。因此,您需要首先清除首选项,提交更改并仅删除首选项备份文件。

这应该足以实现您的设计决策。

+0

哦,所以即使我刚删除文件而未先清除数据,数据仍会占用内存?另外,你能否指点我一个教程或一些显示如何进入目录并删除文件的东西。谢谢 – Andrew 2011-05-25 13:52:41

+5

是的,它可能会将数据保存在内存中一段时间​​。它可能会检测到该文件已被删除并自行清除,但我不建议依赖该文件。至于删除文件见文档:http:它非常简单:'File file = new File(“/ data/data /.../ shared_prefs/X.xml”);'然后'file.delete();' – inazaruk 2011-05-25 13:56:43

+0

哦,太棒了,很简单。谢谢 。 – Andrew 2011-05-25 15:23:18

17

下面是一个简单的方法来清除给定环境下的所有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中使用共享首选项,这可能会导致竞争条件,并且可能无法正常工作。

+1

到目前为止发现的最佳答案 – 2016-05-23 17:23:05

2

其简单的天才!

您的默认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(); 
+0

第二种选择是错误的。 getApplicationContext()。getFilesDir()。getPath()+“/”+“shared_prefs /引向/ data/data.html/home/files/。第二个选项为Downvote。 – goseib 2015-03-22 19:05:35

+0

第二个选项错误。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

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); 
    } 
}