Androidのアプリから共有設定データを削除する方法


478

アプリケーションのSharedPreferencesデータを削除するにはどうすればよいですか?

多くのWebサービスを使用してデータを同期するアプリケーションを作成しています。テストのために、アプリを再起動するときに、SharedPreferencesの値を消去する必要があります。

回答:


871

特定の値を削除するには:SharedPreferences.Editor.remove()の後にcommit()

それらをすべて削除してSharedPreferences.Editor.clear()から、commit()

戻り値を気にせず、アプリケーションのメインスレッドからこれを使用している場合は、apply()代わりに使用することを検討してください。


268
context.getSharedPreferences( "YOUR_PREFS"、0).edit()。clear()。commit(); //すべての設定を削除します:)
rubdottocom

2
@yoshiには間違いなくremove()とclear()があります。特定の設定を削除するにはremove()を使用し、すべてを削除するにはclear()を使用します。元の質問では、すべて削除する必要があるかどうかが明確ではありませんでした。
マークB

9
設定ファイルをクリアしても、実際には削除されていないようです。私自身のテストでは、アプリ情報パネルにリストされた「データ」の使用状況を監視しており、新しいSharedPreferenceファイルを作成すると、この値に4KBが追加されますが、editor.clear()。commit()を使用しても数は減りません。
コードコマンダー

2
@rubdottocomコメントを別の回答にしてみませんか?
テクノフィル2015

10
@rubdottocomは.commit()の代わりに.apply()を使用する方がよい
Juan Aguilar Guisado '22

173

私の解決策:

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

2
変数TEXTのみが削除されますか?
Si8 2013

3
@ SiKni8はい、それはkeyを持つkey / valueペアのみを削除します"text"
Dennis

久しぶりに動作させることができましたが、返答ありがとうございます:)
Si8

あなたは私の完全な正気を救った。:Pありがとうございます。オブジェクトの1つの要素の設定を一度にクリアしようとしていましたが、これは美しく機能します。
Azurespot 2016年

3
commit()の代わりにapply()を使用して、バックグラウンドスレッドでタスクを実行することを検討してください。
ゾーン

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_ahmad 2016年

2
ファイル内の設定だけでなく、設定ファイル全体を削除するにはどうすればよいですか?
Srikar Reddy

commit()の代わりにapply()を使用して、バックグラウンドスレッドでタスクを実行します。commit()はブロックし、データをストレージに即座に書き込みます。apply()は非同期です。
Vaibhav

64

毎回削除する必要がない場合は、次の場所から手動で削除できます。

設定->アプリケーション->アプリケーションの管理->(アプリを選択)->データの消去またはアンインストール

Androidの新しいバージョン:

設定->アプリケーション->(アプリを選択)->ストレージ->データのクリアとキャッシュのクリア


5
これをプログラムで行うことができますか。
amity

@amity他の答えはプログラム的にそれを行います。
Doomsknight

31
非プログラム的なオプションをありがとう。
CorayThan 2014

2
@amity-一部の人はこの答えを必要としていました。AndroidエミュレーターでSharedPrefsを削除してコードのテストを続行できるようにする方法がわかりませんでした。
TJビドル

1
Android Studio 2.2.2 10/18/2016にはありません。
鳥のようなロビン

26

1行でAndroid共有設定を削除する:-)

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

またはapply非ブロッキング非同期操作の場合:

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

私にとって最善の解決策。sharedpreferencesコンテンツに同期が必要な場合はほとんどありません。
Juan Aguilar Guisado

19

すべてのソリューションが完全に機能していないか、完全に機能していないようです

アクティビティ内のすべてのSharedPreferencesをクリアする

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

onCreate後にメインアクティビティからこれを呼び出します

注*私はの.apply()代わりに使用しました.commit()。commit()を自由に選択できます。


まさに私が欲しいもの。おかげですべてのデフォルト設定がクリアされました
Arpit Patel 2017

11

ルート化された電話がなくても、adbシェルを使用してこれを行うことができます。唯一の問題は、アプリがデバッグ可能でなければならないことです。

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年後に見つけたと思います...
Richard Le Mesurier 2013

これはSharedpreferencesではなく、sqliteデータベースです
OneCricketeer 2018


9

API 24(Nougat)では、次のことができます。

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



-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ます。
Anubian Noob 2015

なぜこれはそんなに反対されたのですか?これは有用な答えで、私が探していたものです。
マットD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.