如何在Android中从App删除共享的首选项数据


477

如何删除我的应用程序的SharedPreferences数据?

我正在创建一个使用大量Web服务来同步数据的应用程序。出于测试目的,我需要在重新启动应用程序时擦除一些SharedPreferences值。

Answers:


869

删除特定值:SharedPreferences.Editor.remove()后跟一个commit()

要删除所有这些,SharedPreferences.Editor.clear()然后删除commit()

如果您不关心返回值,并且正在应用程序的主线程中使用此值,请考虑使用apply()代替。


268
context.getSharedPreferences(“ YOUR_PREFS”,0).edit()。clear()。commit(); //删除所有偏好:)
rubdottocom 2012年

2
@yoshi肯定有一个remove()和一个clear()。使用remove()删除特定的首选项,使用clear()删除所有首选项。最初的问题尚不清楚,他们是否需要全部删除。
Mark B

9
清除首选项文件似乎并未真正删除它。在我自己的测试中,通过观看“应用程序信息”面板中列出的“数据”使用情况,创建新的SharedPreference文件会为此值添加4KB,但使用editor.clear()。commit()不会减少数量。
代码指挥官

2
@rubdottocom为什么不将您的评论作为单独的答案?
technophyle

10
@rubdottocom最好使用.apply()而不是.commit()
Juan Aguilar Guisado

173

我的解决方案:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();

2
这是否仅删除变量TEXT?
2013

3
@ SiKni8是的,仅删除带有key的键/值对"text"
丹尼斯2014年

我能够使它正常工作,因为已经有一段时间了,但是感谢您的答复:)
Si8 2014年

你救了我的绝对理智。:P谢谢。我试图一次清除一个对象的一个​​元素的偏好,并且效果很好。
Azurespot '16

3
考虑使用apply()而不是commit()在后台线程中执行任务。
Zon

124

删除所有首选项:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().clear().commit();

删除单个首选项:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();

1
会是什么KeyName
hasnain_ahmad16年

2
如何删除整个首选项文件,而不仅仅是文件内的首选项?
斯里卡·雷迪

使用apply()而不是commit()在后台线程中执行任务。commit()阻止并将数据立即写入存储。apply()是异步的。
Vaibhav

64

如果不需要每次都删除它,则可以从以下位置手动删除它:

设置->应用程序->管理应用程序->(选择应用程序)->清除数据或卸载

较新的Android版本:

设置->应用程序->(选择应用程序)->存储->清除数据并清除缓存


5
我们可以通过程序来完成此操作吗?
amity 2012年

@amity另一个答案是通过编程实现的。
Doomsknight

31
感谢您提供非编程选项。
Coray,2014年

2
@amity-我们中有些人需要这个答案。我不确定如何在Android模拟器上删除SharedPrefs,以便继续测试我的代码。
TJ Biddle

1
android studio 2.2.2 10/18/2016中不存在。
罗宾像鸟一样

26

一行删除Android共享首选项:-)

context.getSharedPreferences("YOUR_PREFS", 0).edit().clear().commit();

apply用于非阻塞异步操作:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();

对我来说最好的解决方案。对于共享首选项内容,在极少数情况下需要同步。
Juan Aguilar Guisado

19

似乎所有解决方案都不完全可行或已过时

清除活动中的所有SharedPreferences

PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().clear().apply();

在onCreate之后从Main Activity调用它

注意*我使用.apply()而不是.commit(),您可以自由选择commit();


正是我想要的。谢谢,它清除了所有默认的首选项
Arpit Patel

11

您甚至可以在没有根电话的情况下使用adb shell来执行此操作。唯一的问题是该应用程序必须是可调试的。

run-as <your package name> <command>

例如:

run-as com.asdf.blah rm /data/data/com.asdf.blah/databases/myDB.db

或者,您可以执行上述操作,但不执行将命令定向到应用程序包根目录并允许您在应用程序上下文中执行更多命令的命令。


1
+1可获得有用的提示run-as。您以为3年后我会发现这个的……
理查德·勒·梅苏里尔

这不是Sharedpreferences,而是sqlite数据库
OneCricketeer


9

从API 24(牛轧糖)开始,您可以执行以下操作:

context.deleteSharedPreferences("YOUR_PREFS");

但是,没有向后兼容性,因此,如果您支持的版本数少于24,请坚持:

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 


8

您也可以使用设备手动卸载应用程序。然后,当您重新安装应用程序时,共享的首选项已被重置。


谢谢-我不想以编程方式删除sharedPreferences,所以这对我有用。
西蒙(Simon)

在我的设备上,我可以选择“卸载”选项上的“清除数据”,该选项对我有用,并且不需要重新安装应用程序。
G O'Rilla 2015年

8

在类定义中:

private static final String PREFERENCES = "shared_prefs";

private static final SharedPreferences sharedPreferences  = getApplicationContext().getSharedPreferences(PREFERENCES, MODE_PRIVATE);

课堂内:

public static void deleteAllSharedPrefs(){
    sharedPreferences.edit().clear().commit();
}

7

试试这个代码:

SharedPreferences sharedPreferences = getSharedPreferences("fake", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.clear().commit();

5

如果是为了您的测试。您可以使用adb命令。

adb shell pm clear <package name>

5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

这将删除名称为“ someTag”的已保存共享首选项。


3
  • 要删除特定值,

SharedPreferences.Editor remove(String key)后跟commit()或apply()

  • 要删除所有值,

    SharedPreferences.Editor clear()后跟commit()或apply()



2

要从任何类集中清除所有SharedPreferences:

public static SharedPreferences.Editor getEditor(Context context) {
    return getPreferences(context).edit();
}

然后从任何类中:(commit返回一个布尔值,您可以在其中检查是否清除了“首选项”)

Navigation.getEditor(this).clear().commit();

或者您可以使用apply; 它返回空

Navigation.getEditor(this).clear().apply();

1
new File(context.getFilesDir(), fileName).delete();

我可以使用共享首选项删除文件


以上所有解决方案都是错误的,只有删除文件才是删除共享首选项的正确选择
Dreamer

1

由于我有许多共享的首选项键,因此没有答案对我有用。

假设您正在运行的是Android测试而非单元测试。

它为我工作循环并删除所有shared_prefs文件。

@BeforeClass将在所有测试和ActivityTestRule之前运行

@BeforeClass
public static void setUp() {
    Context context = InstrumentationRegistry.getTargetContext();

    File root = context.getFilesDir().getParentFile();
    String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list();
    for (String fileName : sharedPreferencesFileNames) {
        context.getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
    }
}

0

科特林KTX的方式来清除所有的喜好:

val prefs: SharedPreferences = getSharedPreferences("prefsName", Context.MODE_PRIVATE)
prefs.edit(commit = true) {
    clear()
}

单击此处查看所有共享首选项操作以及示例



-6

今天早上刚做。在命令提示符下:

adb shell
cd /data/data/YOUR_PACKAGE_NAME/shared_prefs
rm * // to remove all shared preference files
rm YOUR_PREFS_NAME.xml // to remove a specific shared preference file

注意:这需要有根目录的设备,例如库存的Android虚拟设备,Genymotion设备或实际有根目录的手机/平板电脑等。


9
因此,无论对此投票否决的人,都应该也可以解释一下原因:您需要有根电话才能/data/data直接访问!
努阿拉

3
您需要从应用程序而不是ADB Shell中删除SharedPreferences。使用以下方法完成:SharedPreferences.edit()。clear()。commit();
ThePunisher 2014年

从来没有问过他们想要没有根的解决方案。但是这里存在技术错误;因为此方法需要root用户,所以您必须在运行su之后adb shell才能打开特权shell。
Anubian Noob 2015年

为什么这么低估?这是一个有用的答案,也是我一直在寻找的答案。
马特D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.