我允許用戶創建多個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