วิธีการลบข้อมูลการตั้งค่าที่แชร์จากแอพใน Android


478

ฉันจะลบข้อมูล SharedPreferences สำหรับแอปพลิเคชันของฉันได้อย่างไร

ฉันกำลังสร้างแอปพลิเคชันที่ใช้บริการเว็บจำนวนมากเพื่อซิงค์ข้อมูล เพื่อการทดสอบฉันต้องล้างค่า SharedPreferences บางค่าเมื่อฉันรีสตาร์ทแอพ

คำตอบ:


870

ในการลบค่าเฉพาะ: SharedPreferences.Editor.remove ()ตามด้วย acommit()

หากต้องการลบออกทั้งหมดSharedPreferences.Editor.clear()ตามด้วยcommit()

หากคุณไม่สนใจเกี่ยวกับค่าส่งคืนและคุณใช้สิ่งนี้จากเธรดหลักของแอปพลิเคชันของคุณให้พิจารณาใช้apply()แทน


268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // ลบค่าเริ่มต้นทั้งหมดของคุณ :)
rubdottocom

2
@yoshi มีการลบอย่างแน่นอน () และชัดเจน () คุณใช้ remove () เพื่อลบการตั้งค่าเฉพาะคุณใช้ clear () เพื่อลบพวกเขาทั้งหมด คำถามเดิมไม่ชัดเจนหากพวกเขาต้องการที่จะลบทั้งหมดหรือไม่
ทำเครื่องหมาย B

9
การล้างไฟล์การกำหนดค่าตามความชอบดูเหมือนจะไม่ลบจริงๆ ในการทดสอบของฉันเองโดยดูการใช้งาน "ข้อมูล" ที่แสดงในแผงข้อมูลของแอปการสร้างไฟล์ SharedPreference ใหม่เพิ่ม 4KB ให้กับค่านี้ แต่การใช้ editor.clear (). commit () ไม่ลดจำนวน
รหัสผู้บัญชาการ

2
@rubdottocom ทำไมคุณไม่ใส่ความคิดเห็นของคุณเป็นคำตอบแยกต่างหาก
technophyle

10
@rubdottocom ให้ใช้ .apply () แทนที่จะเป็น. คอมมิท ()
Juan Aguilar Guisado

173

ทางออกของฉัน:

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

2
นั่นเป็นการลบตัวแปร TEXT เท่านั้นหรือไม่
Si8

3
@ SiKni8 ใช่ว่าจะลบคู่คีย์ / ค่าด้วยคีย์"text"เท่านั้น
Dennis

ฉันก็สามารถที่จะได้รับมันในการทำงานเพราะจะได้รับในขณะที่ แต่ขอขอบคุณสำหรับการตอบสนอง :)
Si8

คุณบันทึกสติของฉันแน่นอน : P ขอขอบคุณ ฉันพยายามที่จะล้างการตั้งค่าสำหรับองค์ประกอบของวัตถุในเวลาและการทำงานอย่างสวยงาม
Azurespot

3
พิจารณาใช้ Apply () แทนที่จะคอมมิต () เพื่อทำงานในเธรดพื้นหลัง
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_ahmad

2
วิธีการลบไฟล์การตั้งค่าทั้งหมดไม่ใช่เฉพาะการกำหนดค่าภายในไฟล์
Srikar Reddy

ใช้ Apply () แทนที่จะคอมมิต () เพื่อทำงานในเธรดพื้นหลัง กระทำ () บล็อกและเขียนข้อมูลไปยังที่จัดเก็บทันที Apply () ไม่ตรงกัน
Vaibhav

64

หากไม่จำเป็นต้องลบออกทุกครั้งคุณสามารถลบออกได้ด้วยตนเองจาก:

การตั้งค่า -> แอปพลิเคชัน -> จัดการแอปพลิเคชัน -> (เลือกแอปของคุณ) -> ล้างข้อมูลหรือถอนการติดตั้ง

Android เวอร์ชันใหม่กว่า:

การตั้งค่า -> แอปพลิเคชัน -> (เลือกแอปของคุณ) -> ที่เก็บข้อมูล -> ล้างข้อมูลและล้างแคช


5
เราสามารถทำสิ่งนี้โดยทางโปรแกรมได้ไหม
มิตรภาพ

@amity คำตอบอื่น ๆ ก็คือโปรแกรม
Doomsknight

31
ขอบคุณสำหรับตัวเลือกที่ไม่ใช่การเขียนโปรแกรม
CorayThan

2
@amity - เราบางคนต้องการคำตอบนี้ ฉันไม่แน่ใจวิธีการลบ SharedPrefs บน Android Emulator เพื่อที่ฉันจะได้ทำการทดสอบรหัสของฉันต่อไป
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

หมายเหตุ * ฉันใช้.apply()แทนคุณ.commit()มีอิสระในการเลือกกระทำ ();


สิ่งที่ฉันต้องการ ขอขอบคุณล้างการตั้งค่าเริ่มต้นทั้งหมด
Arpit Patel

11

คุณสามารถใช้เชลล์ adb เพื่อทำสิ่งนี้แม้ไม่มีโทรศัพท์รูท สิ่งที่จับได้เพียงอย่างเดียวคือแอปต้องสามารถ debuggable

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

นี่ไม่ใช่การแปลภาษาร่วมกันเป็นฐานข้อมูล sqlite
OneCricketeer


9

ในฐานะของ API 24 (Nougat) คุณสามารถทำได้:

context.deleteSharedPreferences("YOUR_PREFS");

อย่างไรก็ตามไม่มีความเข้ากันได้ย้อนหลังดังนั้นหากคุณสนับสนุนอะไรที่น้อยกว่า 24 ให้ทำตาม:

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


8

คุณสามารถถอนการติดตั้งแอพด้วยตนเองโดยใช้อุปกรณ์ของคุณ จากนั้นเมื่อคุณติดตั้งแอพของคุณใหม่การตั้งค่าที่แชร์ได้ถูกรีเซ็ต


ขอบคุณ - ฉันไม่ต้องการลบการแชร์การตั้งค่าแบบเป็นโปรแกรมโดยทางโปรแกรม
Simon

ในอุปกรณ์ของฉันฉันมีตัวเลือก "ล้างข้อมูล" ในตัวเลือกการถอนการติดตั้งซึ่งใช้งานได้สำหรับฉันและลบความจำเป็นในการติดตั้งแอปของฉันใหม่
G O'Rilla

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 ลบ (คีย์สตริง)ตามด้วยการกระทำ () หรือใช้ ()

  • หากต้องการลบค่าทั้งหมด

    SharedPreferences.Editor clear ()ตามด้วย commit () หรือ Apply ()


3

ในการลบคู่ค่าคีย์ออกจากการตั้งค่าคุณสามารถทำสิ่งต่อไปนี้ได้อย่างง่ายดาย

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

ฉันได้พัฒนาห้องสมุดเพื่อการปรับแต่งค่าที่แชร์แบบง่าย ๆ คุณอาจพบลิงค์ต่อไปนี้

https://github.com/farruhha/SimplePrefs


2

วิธีล้าง SharedPreferences ทั้งหมดจากส่วนกลางจากคลาสใดก็ได้:

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

และจากคลาสใดก็ได้: (คอมมิทส่งคืนบูลีนที่คุณสามารถตรวจสอบว่าการตั้งค่าของคุณถูกลบหรือไม่)

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

หรือคุณสามารถใช้นำไปใช้; มันกลับเป็นโมฆะ

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

วิธีKotlin ktxเพื่อล้างค่ากำหนดทั้งหมด :

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

คลิกที่นี่สำหรับการดำเนินการกำหนดลักษณะที่ใช้ร่วมกันทั้งหมดพร้อมตัวอย่าง


-2

คุณสามารถใช้preferences.edit().remove("key").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โดยตรง!
nuala

3
คุณต้องลบ SharedPreferences จาก Application และไม่ใช่ ADB Shell โดยใช้: SharedPreferences.edit (). clear (). commit (); commit ();
ThePunisher

ถามไม่เคยบอกว่าพวกเขาต้องการทางออกที่ไม่มีรูต มีข้อผิดพลาดทางเทคนิคที่นี่แม้ว่า; เนื่องจากเมธอดนี้ต้องการรูทคุณต้องรันsuหลังจากadb shellเปิดเชลล์ที่มีสิทธิใช้งาน
Anubian Noob

ทำไมเรื่องนี้จึงลดลงมาก นี่เป็นคำตอบที่มีประโยชน์และเป็นคำตอบที่ฉันต้องการ
Matt D
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.