Cara menghapus data preferensi bersama dari Aplikasi di Android

478

Bagaimana cara saya menghapus data SharedPreferences untuk aplikasi saya?

Saya membuat aplikasi yang menggunakan banyak layanan web untuk menyinkronkan data. Untuk tujuan pengujian, saya perlu menghapus beberapa nilai SharedPreferences ketika saya me-restart aplikasi.

Andrew
sumber

Jawaban:

871

Untuk menghapus nilai tertentu: SharedPreferences.Editor.remove () diikuti oleh acommit()

Untuk menghapusnya semua SharedPreferences.Editor.clear()diikuti oleh acommit()

Jika Anda tidak peduli dengan nilai pengembalian dan Anda menggunakan ini dari utas utama aplikasi Anda, pertimbangkan untuk menggunakannya apply().

Mark B
sumber
268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // hapus semua prefs Anda :)
rubdottocom
2
@Yoshi pasti ada remove () dan juga clear (). Anda menggunakan remove () untuk menghapus preferensi tertentu, Anda menggunakan clear () untuk menghapus semuanya. Pertanyaan awal tidak jelas apakah mereka perlu menghapus semuanya atau tidak.
Mark B
9
Menghapus file preferensi tampaknya tidak benar-benar menghapusnya. Dalam pengujian saya sendiri dengan menonton penggunaan "Data" yang tercantum di panel App Info, membuat file SharedPreference baru menambahkan 4KB ke nilai ini tetapi menggunakan editor.clear (). Commit () tidak mengurangi angka.
Code Commander
2
@rubdottocom Mengapa Anda tidak menaruh komentar Anda sebagai jawaban terpisah?
technophyle
10
@rubdottocom lebih baik menggunakan .apply () daripada .commit ()
Juan Aguilar Guisado
173

Solusi saya:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();
vaibhav vijay
sumber
2
Apakah itu hanya menghapus variabel TEKS?
Si8
3
@ SiKni8 Ya, itu hanya menghapus pasangan kunci / nilai dengan kunci "text".
Dennis
Saya bisa membuatnya bekerja karena sudah lama tetapi terima kasih atas tanggapannya :)
Si8
Anda menyelamatkan kewarasan mutlak saya. : P TERIMA KASIH. Saya mencoba untuk menghapus prefs untuk satu elemen objek sekaligus, dan ini bekerja dengan indah.
Azurespot
3
Pertimbangkan untuk menggunakan apply () daripada commit () untuk melakukan tugas di utas latar belakang.
Zon
124

Menghapus semua preferensi:

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

Menghapus preferensi tunggal:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();
zserghei
sumber
1
Apa yang akan terjadi KeyName?
hasnain_ahmad
2
Bagaimana cara menghapus seluruh file preferensi, bukan hanya preferensi di dalam file?
Srikar Reddy
Gunakan apply () alih-alih komit () untuk melakukan tugas di utas latar belakang. komit () memblokir dan menulis data ke penyimpanan secara instan. apply () tidak sinkron.
Vaibhav
64

Jika tidak perlu dihapus setiap kali, Anda dapat menghapusnya secara manual dari:

Pengaturan -> Aplikasi -> Kelola aplikasi -> (pilih aplikasi Anda) -> Bersihkan data atau Hapus instalasi

Versi Android yang lebih baru:

Pengaturan -> Aplikasi -> (pilih aplikasi Anda) -> Penyimpanan -> Hapus data dan Hapus cache

Nobu
sumber
5
dapatkah kita melakukan hal-hal ini secara terprogram.
amity
@ amity Jawaban lain melakukannya secara terprogram.
Doomsknight
31
Terima kasih untuk opsi yang tidak terprogram.
CorayThan
2
@ amity - Beberapa dari kita membutuhkan jawaban ini. Saya tidak yakin bagaimana menghapus SharedPrefs pada Android Emulator sehingga saya dapat terus menguji kode saya.
TJ Biddle
1
Tidak ada di android studio 2.2.2 10/18/2016.
Robin suka burung
26

Menghapus Preferensi Bersama Android dalam satu baris :-)

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

Atau applyuntuk operasi asinkron yang tidak memblokir:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();
rubdottocom
sumber
Solusi terbaik untuk saya. Ada beberapa kasus ketika sinkron diperlukan untuk konten preferensi bersama.
Juan Aguilar Guisado
19

Tampaknya semua solusi tidak sepenuhnya berfungsi atau mati

untuk menghapus semua SharedPreferences dalam suatu Kegiatan

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

Sebut ini dari Kegiatan Utama setelah onCreate

note * i digunakan .apply()alih-alih .commit(), Anda bebas memilih commit ();

Shesh Keshk
sumber
persis apa yang saya inginkan. Terima kasih itu menghapus semua preferensi default
Arpit Patel
11

Anda dapat menggunakan adb shell untuk melakukan ini bahkan tanpa ponsel yang di-rooting. Satu-satunya tangkapan adalah aplikasi tersebut harus dapat debuggable.

run-as <your package name> <command>

Sebagai contoh:

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

Atau, Anda bisa melakukan hal di atas tetapi tanpa perintah yang akan mengarahkan Anda ke root paket aplikasi dan memungkinkan Anda untuk mengeksekusi lebih banyak perintah dalam konteks aplikasi.

Johnson Wong
sumber
1
+1 untuk kiat bermanfaat aktif run-as. Anda akan berpikir saya akan menemukan ini setelah 3 tahun ...
Richard Le Mesurier
Ini bukan Sharedpreferences, ini database sqlite
OneCricketeer
10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
Vaishali Sutariya
sumber
9

Pada API 24 (Nougat) Anda bisa melakukan:

context.deleteSharedPreferences("YOUR_PREFS");

Namun, tidak ada kompatibilitas ke belakang, jadi jika Anda mendukung sesuatu yang kurang dari 24, tetap dengan:

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

Bersihkan semuanya:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()
Dan Alboteanu
sumber
8

Anda juga dapat menghapus aplikasi secara manual menggunakan perangkat Anda. Kemudian ketika Anda menginstal ulang aplikasi Anda, preferensi bersama telah diatur ulang.

wizurd
sumber
Terima kasih - saya tidak ingin secara terprogram menghapus sharedPreferences jadi ini bekerja untuk saya.
Simon
Di perangkat saya, saya memiliki opsi untuk "menghapus data" pada opsi hapus instalan, yang berfungsi untuk saya dan menghapus kebutuhan untuk menginstal ulang aplikasi saya.
G O'Rilla
8

Dalam definisi kelas:

private static final String PREFERENCES = "shared_prefs";

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

Di dalam kelas:

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

Coba kode ini:

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

Jika ini untuk pengujian Anda. Anda dapat menggunakan perintah adb.

adb shell pm clear <package name>
Prakash
sumber
5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

Ini akan menghapus preferensi bersama yang disimpan dengan nama "someTag".

Kiran kg
sumber
3
  • Untuk menghapus nilai tertentu,

SharedPreferences.Editor menghapus (String string) diikuti oleh commit () atau apply ()

  • Untuk menghapus semua nilai,

    SharedPreferences.Editor menghapus () diikuti oleh commit () atau apply ()

Palak Jain
sumber
3

Untuk menghapus pasangan nilai kunci dari preferensi, Anda dapat dengan mudah melakukan hal berikut

getActivity().getSharedPreference().editor().remove("key").apply();

Saya juga telah mengembangkan perpustakaan untuk memudahkan manipulasi preferensi bersama. Anda dapat menemukan tautan berikut

https://github.com/farruhha/SimplePrefs

Farruh Habibullaev
sumber
2

Untuk menghapus semua SharedPreferences secara terpusat dari kelas mana pun:

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

Dan dari kelas mana pun: (komit mengembalikan Boolean tempat Anda dapat memeriksa apakah Preferensi Anda dihapus atau tidak)

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

Atau Anda bisa menggunakan berlaku; mengembalikan batal

Navigation.getEditor(this).clear().apply();
Sufiyan Ansari
sumber
1
new File(context.getFilesDir(), fileName).delete();

Saya dapat menghapus file dalam preferensi bersama dengannya

Dũng Phạm Tiến
sumber
Semua solusi di atas salah, hanya menghapus file yang benar untuk menghapus preferensi bersama
Dreamer
1

Tidak ada jawaban yang berfungsi untuk saya karena saya memiliki banyak tombol preferensi bersama.

Katakanlah Anda menjalankan Tes Android daripada tes unit.

Ini berfungsi untuk saya loop dan menghapus semua file shared_prefs .

@BeforeClass akan berjalan sebelum semua tes dan 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();
    }
}
Allen
sumber
0

Cara Kotlin ktx untuk menghapus semua preferensi:

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

Klik di sini untuk semua operasi preferensi Bersama dengan contoh

Paritosh
sumber
-2

Anda dapat menggunakan preferences.edit().remove("key").commit()untuk menghapus nilai yang disimpan dari preferensi bersama.

Ashish Jaiswal
sumber
-6

Lakukan saja pagi ini. Dari prompt perintah:

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

CATATAN : Ini membutuhkan perangkat yang di-rooting seperti stok perangkat virtual Android, perangkat Genymotion, atau handset / tablet yang sudah di-root, dll.

kdahlhaus
sumber
9
Jadi siapa pun yang memilih solusi ini mungkin juga harus menjelaskan alasannya: Anda memerlukan ponsel yang di-rooting untuk mengakses /data/datasecara langsung!
nuala
3
Anda perlu Menghapus SharedPreferences dari Aplikasi dan bukan pada ADB Shell. Hal ini dilakukan dengan menggunakan: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher
Ditanya tidak pernah mengatakan mereka menginginkan solusi tanpa root. Ada kesalahan teknis di sini; karena metode ini membutuhkan root, Anda harus menjalankan susetelah adb shellmembuka shell istimewa.
Anubian Noob
Mengapa hal ini begitu diremehkan? Ini adalah jawaban yang berguna dan yang saya cari.
Matt D