删除共享首选项文件

问题描述 投票:0回答:6

我允许用户创建多个

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

我的问题是:“如何在代码中或手动删除(不仅仅是清除)

SharedPreferences
文件?”

android sharedpreferences
6个回答
36
投票

如果您通过

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
实例将所有数据保存在内存中。因此,您需要首先清除首选项,提交更改,然后才删除首选项支持文件。

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


32
投票

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


9
投票
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);
    }
}

9
投票

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

4
投票

这就是简单的天才!

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

0
投票

我发现(在 Android 12 中,原始问题发生多年后),如果我在某些代码编辑首选项值后不久删除共享首选项文件,则应用新的首选项可能要等到我删除该文件后才能完成,此时 Android将重新创建文件,并保留所有先前的值。

当我按照 @inazaruk 的建议在删除文件之前清除首选项时,也会发生这种情况,因为我在那里使用了 apply() 。如果我使用 commit() 代替,也许不会造成问题,但我发现在我的情况下不需要清除首选项。

© www.soinside.com 2019 - 2024. All rights reserved.