Làm cách nào để lấy tất cả các khóa của SharedPreferences theo lập trình trong Android?


77

Làm thế nào để lấy tất cả các khóa SharedPreferences, không phải giá trị của tùy chọn chỉ khóa duy nhất?

prefA = getSharedPreferences("MyAttack", MODE_PRIVATE);
prefB= getSharedPreferences("MySkill", MODE_PRIVATE);

1
Ý bạn là tất cả các khóa tùy chọn của bạn hay tên tùy chọn?
Niko

câu hỏi của tôi là làm thế nào để có được tất cả các tùy chọn mà u được dán bằng tên chứ không phải giá trị của những gì bên trong tùy chọn, bởi vì bạn có thể đặt tên pref nếu bạn muốn, vì vậy điều gì sẽ xảy ra nếu bạn tạo nhiều tên tùy chọn không phải là một giá trị bên trong tùy chọn, vấn đề là cách lấy tất cả tên tùy chọn đã khai báo. không phải các giá trị tùy chọn bên trong tùy chọn
Piolo Opaw

Câu trả lời:


188

SharedPreferencescó phương thức getAll()trả về a Map<String, ?>. Từ Bản đồ, bạn có thể dễ dàng truy xuất các khóa keySet()và ánh xạ khóa / giá trị với entrySet():

Map<String, ?> allEntries = prefA.getAll();
for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
    Log.d("map values", entry.getKey() + ": " + entry.getValue().toString());
} 

3
Tôi đã hỏi google về câu hỏi này và tôi đã được chỉ đến câu trả lời này ngay lập tức, mất khoảng 2,1 giây để tìm câu trả lời. Cảm ơn bạn đời!
Sindri Þór

1
bất cứ ai biết tại sao điều này có khả năng ném một NullPointerException?
Kushan

2
@kushan, bản đồ chấp nhận giá trị null. toString có thể gây ra NPE và nó không cần thiết. Toán tử cộng đã quan tâm đến việc chuyển đổi sang
Chuỗi

16

Những gì bạn có thể làm là sử dụng phương thức getAll () của SharedPreferences và lấy tất cả các giá trị trong Map và sau đó bạn có thể dễ dàng lặp lại chúng:

Map<String,?> keys = prefs.getAll();

for(Map.Entry<String,?> entry : keys.entrySet()){
    Log.d("map values",entry.getKey() + ": " + entry.getValue().toString());            
}

Để biết thêm, bạn có thể kiểm tra việc triển khai dump () của PrefUtil.java bằng liên kết này .


16

Sử dụng phương thức getAll () của android.content.SharedPreferences.

Map<String, ?> map = sharedPreferences.getAll();

7

Kotlin sẽ cho phép bạn lấy tất cả các khóa SharedPreferences của mình chỉ bằng một dòng bằng cách sử dụng Bản đồ .

Chúc mừng bạn đời 🎉

val sharedPreferences = context.getSharedPreferences("SHARED_PREFERENCES", Context.MODE_PRIVATE)
val sharedPreferenceIds = sharedPreferences.all.map { it.key } //returns List<String>

4

Kiểm tra mã bên dưới để biết getAll()phương pháp

Map<String, ?> prefsMap = prefA.getAll();
for (Map.Entry<String, ?> entry: prefsMap.entrySet()) {
    Log.v("SharedPreferences", entry.getKey() + ":" + 
entry.getValue().toString());
}

2

Sau khi đọc phản hồi @Delacrix và chơi với Kotlin-way (được thử nghiệm trong Kotlin 1.3.11) để lấy các khóa, tôi đã tìm ra một phiên bản thậm chí còn ngắn hơn để lấy các khóa (hoặc thậm chí các giá trị):

val prefsA = context.getSharedPreferences("MyAttack", Context.MODE_PRIVATE)
val prefsAIDs = sharedPreferences.all.keys //returns MutableSet<String>

Theo cách tương tự, bạn chỉ có thể truy cập các giá trị thông qua sharedPreferences.all.values(ngay cả tho không phải là những gì bạn đã hỏi trong câu hỏi của mình, có thể hữu ích cho những người đọc khác).


1

Mặc dù câu trả lời của @ Blackbelt khá phổ biến ở đây, tôi nghĩ rằng nó không thực sự nhắm vào câu hỏi. (Không có gì đáng ngạc nhiên vì câu hỏi trộn lẫn thuật ngữ của tên và khóa tùy chọn.) Tôi đoán câu hỏi là làm thế nào để tìm ra phiên bản tùy chọn chia sẻ nào đã được tạo - điều này có thể được quan tâm nếu các tên được tạo động.

Đây là hai chiến lược cho điều đó:

  • tạo một phiên bản "meta" tùy chọn chia sẻ khác trong đó tất cả các phiên bản tiền chất được chia sẻ đã tạo đều được đăng ký bằng cách thêm một cặp khóa / giá trị cho nó vào meta pref - với khóa là tên tiền chất được chia sẻ và giá trị là bất kỳ giá trị nào, ví dụ true.

    getSharedPreferences( DYNAMIC_PREFS_NAME, 0 )
        .edit().put*(*).apply();
    getSharedPreferences( "meta_prefs_index", 0 )
        .edit().putBoolean( DYNAMIC_PREFS_NAME, true).apply();
    

    Để có được tất cả các tiền đề được chia sẻ do bạn tạo, hãy sử dụng các tiền đề meta và làm theo câu trả lời của @Blackbelt.

  • sở thích chia sẻ có một tệp sao lưu, được lưu trữ trong thư mục /data/data/YOUR_PACKAGE_NAME/shared_prefscó tên YOUR_PREFS_NAME.xml Vì vậy, bạn có thể xem trong thư mục đó để biết các tệp sở thích chia sẻ của mình. Nhưng hãy cẩn thận, có thể có các tệp tùy chọn chia sẻ không được tạo theo logic của bạn! Trước khi tôi gắn bó với cách tiếp cận đầu tiên.

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.