Cách xóa dữ liệu tùy chọn chia sẻ khỏi Ứng dụng trong Android


478

Làm cách nào để xóa dữ liệu SharedPreferences cho ứng dụng của tôi?

Tôi đang tạo một ứng dụng sử dụng nhiều dịch vụ web để đồng bộ hóa dữ liệu. Đối với mục đích thử nghiệm, tôi cần xóa sạch một số giá trị SharedPreferences khi khởi động lại ứng dụng.

Câu trả lời:


871

Để xóa các giá trị cụ thể: SharedPreferences.Editor.remove () theo sau là mộtcommit()

Để loại bỏ tất cả SharedPreferences.Editor.clear() theo sau bởi mộtcommit()

Nếu bạn không quan tâm đến giá trị trả về và bạn đang sử dụng giá trị này từ luồng chính của ứng dụng, hãy xem xét sử dụng apply()thay thế.


268
bối cảnh.getSharedPreferences ("YOU_PREFS", 0) .edit (). clear (). commit (); // xóa tất cả các prefs của bạn :)
rubdottocom 17/03/2016

2
@yoshi chắc chắn có một remove () cũng như rõ ràng (). Bạn sử dụng remove () để xóa các tùy chọn cụ thể, bạn sử dụng Clear () để xóa tất cả chúng. Câu hỏi ban đầu không rõ ràng nếu họ cần loại bỏ tất cả hay không.
Đánh dấu B

9
Xóa tập tin ưu tiên dường như không thực sự xóa nó. Trong các thử nghiệm của riêng tôi bằng cách xem cách sử dụng "Dữ liệu" được liệt kê trong bảng Thông tin ứng dụng, việc tạo tệp SharedPreference mới sẽ thêm 4KB vào giá trị này nhưng sử dụng Editor.clear (). Commit () không làm giảm số lượng.
Chỉ huy mã

2
@rubdottocom Tại sao bạn không đặt bình luận của mình làm câu trả lời riêng?
Technophyle

10
@rubdottocom sử dụng tốt hơn .apply () thay vì .commit ()
Juan Aguilar Guisado

173

Giải pháp của tôi:

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

2
Điều đó chỉ loại bỏ các biến văn bản?
Si8

3
@ SiKni8 Có, chỉ loại bỏ cặp khóa / giá trị bằng khóa "text".
Dennis

Tôi đã có thể làm cho nó hoạt động vì đã được một lúc nhưng cảm ơn bạn đã phản hồi :)
Si8

Bạn đã cứu sự tỉnh táo tuyệt đối của tôi. : P CẢM ƠN BẠN. Tôi đã cố gắng để xóa các prefs cho một yếu tố của một đối tượng tại một thời điểm, và điều này hoạt động rất đẹp.
Azurespot

3
Cân nhắc sử dụng áp dụng () thay vì commit () để thực hiện tác vụ trong luồng nền.
Zon

124

Xóa tất cả các ưu tiên:

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

Xóa tùy chọn duy nhất:

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

1
Điều gì sẽ là KeyName?
hasnain_ahmad

2
Làm thế nào để xóa toàn bộ tệp ưu tiên, không chỉ các tùy chọn bên trong tệp?
Srikar Reddy

Sử dụng áp dụng () thay vì commit () để thực hiện tác vụ trong luồng nền. commit () chặn và ghi dữ liệu vào lưu trữ ngay lập tức. áp dụng () là không đồng bộ.
Vaibhav

64

Nếu không cần phải xóa mỗi lần, bạn có thể xóa thủ công khỏi:

Cài đặt -> Ứng dụng -> Quản lý ứng dụng -> (chọn ứng dụng của bạn) -> Xóa dữ liệu hoặc Gỡ cài đặt

Các phiên bản Android mới hơn:

Cài đặt -> Ứng dụng -> (chọn ứng dụng của bạn) -> Lưu trữ -> Xóa dữ liệu và Xóa bộ nhớ cache


5
chúng ta có thể làm những điều này có lập trình.
tình thương

@amity Câu trả lời khác thực hiện theo chương trình.
Doomsknight

31
Cảm ơn cho một lựa chọn không lập trình.
CorayThan

2
@amity - Một số người trong chúng ta cần câu trả lời này. Tôi không chắc chắn cách xóa SharedPrefs trên Trình giả lập Android để tôi có thể tiếp tục kiểm tra mã của mình.
TJ Biddle

1
Không có trong studio android 2.2.2 10/18/2016.
Robin như con chim

26

Xóa tùy chọn chia sẻ Android trong một dòng :-)

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

Hoặc applycho hoạt động không đồng bộ không chặn:

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

Giải pháp tốt nhất cho tôi. Có một vài trường hợp khi đồng bộ là cần thiết cho nội dung chia sẻ.
Juan Aguilar Guisado

19

Có vẻ như tất cả các giải pháp không hoàn toàn hoạt động hoặc đã chết

để xóa tất cả SharedPreferences trong một Hoạt động

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

Gọi đây từ Hoạt động chính sau onCreate

lưu ý * tôi đã sử dụng .apply()thay vì .commit(), bạn có thể tự do chọn commit ();


chính xác những gì tôi muốn Cảm ơn nó xóa tất cả các tùy chọn mặc định
Arpit Patel

11

Bạn có thể sử dụng shell adb để làm điều này ngay cả khi không có điện thoại đã root. Điều hấp dẫn duy nhất là ứng dụng phải được gỡ lỗi.

run-as <your package name> <command>

Ví dụ:

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

Ngoài ra, bạn chỉ có thể thực hiện các thao tác trên nhưng không có lệnh sẽ đưa bạn đến thư mục gốc của gói ứng dụng và cho phép bạn thực thi nhiều lệnh hơn trong ngữ cảnh của ứng dụng.


1
+1 cho mẹo hữu ích trên run-as. Bạn sẽ nghĩ rằng tôi đã tìm thấy thứ này sau 3 năm ...
Richard Le Mesurier 16/07/13

Đây không phải là Sharedpreferences, đó là cơ sở dữ liệu sqlite
OneCricketeer

10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

9

Kể từ API 24 (Nougat), bạn có thể thực hiện:

context.deleteSharedPreferences("YOUR_PREFS");

Tuy nhiên, không có khả năng tương thích ngược, vì vậy nếu bạn hỗ trợ bất cứ điều gì dưới 24, hãy kiên trì:

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

9

Xóa tất cả:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()

8

Bạn cũng có thể tự gỡ cài đặt ứng dụng bằng thiết bị của mình. Sau đó, khi bạn cài đặt lại ứng dụng của mình, các tùy chọn chia sẻ đã được đặt lại.


Cảm ơn - tôi không muốn lập trình xóa sharedPreferences để điều này có hiệu quả với tôi.
Simon

Trên thiết bị của mình, tôi có tùy chọn "xóa dữ liệu" trên tùy chọn gỡ cài đặt, hoạt động cho tôi và loại bỏ nhu cầu cài đặt lại ứng dụng của tôi.
G O'Rilla

8

Trong các định nghĩa lớp:

private static final String PREFERENCES = "shared_prefs";

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

Bên trong lớp học:

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

7

Hãy thử mã này:

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

5

Nếu nó là để thử nghiệm của bạn. Bạn có thể sử dụng các lệnh adb.

adb shell pm clear <package name>

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

Điều này sẽ xóa các tùy chọn chia sẻ đã lưu với tên "someTag".


3
  • Để xóa một giá trị cụ thể,

SharedPreferences.Editor xóa (Khóa chuỗi) theo sau là một cam kết () hoặc áp dụng ()

  • Để xóa tất cả các giá trị,

    SharedPreferences.Editor xóa () theo sau là một cam kết () hoặc áp dụng ()


3

Để xóa các cặp giá trị chính khỏi tùy chọn, bạn có thể dễ dàng thực hiện các thao tác sau

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

Tôi cũng đã phát triển thư viện để dễ dàng thao tác các sở thích được chia sẻ. Bạn có thể tìm thấy liên kết sau

https://github.com/farruhha/SimplePrefs


2

Để xóa tất cả SharedPreferences tập trung khỏi mọi lớp:

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

Và sau đó từ bất kỳ lớp nào: (cam kết trả về Boolean nơi bạn có thể kiểm tra xem Tùy chọn của mình có bị xóa hay không)

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

Hoặc bạn có thể sử dụng áp dụng; nó trả về khoảng trống

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

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

Tôi có thể xóa tệp trong tùy chọn chia sẻ với nó


Tất cả các giải pháp trên đều sai, chỉ xóa tệp là đúng để xóa tùy chọn chia sẻ
Dreamer

1

Không có câu trả lời nào phù hợp với tôi vì tôi có nhiều khóa tùy chọn chia sẻ.

Giả sử bạn đang chạy Thử nghiệm Android thay vì thử nghiệm đơn vị.

Nó đang làm việc cho tôi vòng lặp và xóa thông qua tất cả các tệp shared_prefs .

@B BeforeClass sẽ chạy trước tất cả các bài kiểm tra và 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

Cách ktx của Kotlin để xóa tất cả các tùy chọn:

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

Bấm vào đây để tất cả các hoạt động tùy chọn được chia sẻ với các ví dụ


-2

Bạn có thể sử dụng preferences.edit().remove("key").commit()để xóa các giá trị đã lưu khỏi tùy chọn chia sẻ.


-6

Mới làm sáng nay. Từ một dấu nhắc lệnh:

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

GHI CHÚ : Điều này yêu cầu một thiết bị đã root, chẳng hạn như các thiết bị ảo Android gốc, thiết bị Genymotion hoặc thiết bị cầm tay / máy tính bảng gốc thực sự, v.v.


9
Vì vậy, bất cứ ai xuống bình chọn giải pháp này cũng có thể giải thích tại sao: Bạn cần một điện thoại đã root để truy cập /data/datatrực tiếp!
Nuala

3
Bạn cần xóa SharedPreferences dưới dạng Ứng dụng chứ không phải ADB Shell. Nó được thực hiện bằng cách sử dụng: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher

Hỏi không bao giờ nói họ muốn một giải pháp không có gốc. Có một lỗi kỹ thuật ở đây mặc dù; bởi vì phương thức này yêu cầu root, bạn phải chạy susau adb shellđể mở shell đặc quyền.
Anubian Noob

Tại sao điều này bị hạ thấp rất nhiều? Đây là một câu trả lời hữu ích và là câu tôi đang tìm kiếm.
Matt D
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.