【问题标题】:Delete SharedPreferences File删除 SharedPreferences 文件
【发布时间】:2011-09-01 18:56:57
【问题描述】:

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

我的问题是:“我怎样才能在代码中删除或手动(不仅仅是清除)SharedPreferences 文件?”

【问题讨论】:

  • 你试过 clear() 方法了吗?我认为它实际上是为了删除存储在共享首选项中的所有值。因此,一旦您提供您的用户将获得共享偏好的默认值。
  • clear() 将清除文件,但不会从文件系统中删除文件。一个设计不佳的应用程序(比如我的)最终可能会包含许多空文件,占用空间。 @kirill 和 @inazaruk 的方法似乎对我有用。

标签: android sharedpreferences


【解决方案1】:

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

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

【讨论】:

  • 哦,所以即使我只是删除了文件而没有先清除它,数据仍然会占用内存吗?另外,您能否向我指出一个教程或显示如何进入目录并删除文件的内容。谢谢
  • 是的,它可能会在内存中保留数据一段时间。它可能会检测到该文件已被删除并自行清除,但我不建议依赖它。至于删除文件,请参阅文档:developer.android.com/reference/java/io/…。很简单:File file= new File("/data/data/.../shared_prefs/X.xml"); 然后file.delete();
  • 您可以通过编程方式删除非路由设备上的共享首选项文件吗?
  • 我上面的问题的答案是:NO.
  • 您可以使用context.getFilesDir().getParent() + File.separator + "shared_prefs"(文件目录是shared_prefs 目录的兄弟),而不是硬编码路径。
【解决方案2】:

这是清除给定上下文的所有 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 类中使用 sharedpreferences 时,这可能会导致竞争条件并且可能无法正常工作。

【讨论】:

  • 迄今为止我找到的最佳答案
  • 不能依赖硬编码路径。谁知道谷歌在下一个安卓版本中可能会发生什么变化。 :(
【解决方案3】:
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);
    }
}

【讨论】:

  • 什么是FileUtils
  • @azizbekian FileUtils 来自 Apache Commons IO 库的实用程序类。 implementation 'commons-io:commons-io:2.6
【解决方案4】:

它的简单天才!

您的默认 sd card preference.xml 文件路径可能是:/data/data/your package name/shared_prefs/your shared preference xml file

喜欢,/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/com.hirecraft.hirecraftmanager/files/shared_prefs/swipe_preferences.xml !!! shared_prefs 文件夹不在 files 文件夹下. 否决第二个选项。
  • 第二个选项是错误的。 getApplicationContext().getFilesDir().getPath()+"/"+"shared_prefs/ 导致 /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/swipe_preferences.xml !!! shared_prefs 文件夹不在 files 文件夹下. 用 getParent() 替换 getPath()。因为你的态度不友好,请投反对票!
【解决方案5】:

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

【讨论】:

  • 不要使用apply(),它可能会导致竞态条件。请改用commit()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2011-11-18
  • 2021-11-18
相关资源
最近更新 更多