2011-05-25 39 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); 
    } 
}