2012-02-16 35 views
62

SharedPreferences có phương pháp GetAll, nhưng nó sẽ trả về không có mục mặc dù thực tế một số phím tồn tại:Làm cách nào để lặp qua tất cả các khóa của tùy chọn được chia sẻ?

PreferenceManager.getDefaultSharedPreferences(this).contains("addNewAddress"); 

trả về true

Map<String, ?> keys=PreferenceManager.getDefaultSharedPreferences(this).getAll(); 

lợi nhuận trống bản đồ

Điều gì là sai? Cách nhận danh sách tất cả các tùy chọn được chia sẻ?

Trả lời

156

Những gì bạn có thể làm là sử dụng phương thức getAll() của SharedPreferences và nhận tất cả các giá trị trong Map<String,?> và sau đó bạn có thể dễ dàng lặp lại thông qua.

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 PrefUtil.java'sdump() triển khai.

+3

này đang trở lại không có giá trị đối với tôi :( – astuter

+3

'GetAll() 'có thể trả về giá trị' NULL' Nó sẽ là tốt hơn để kiểm tra 'keys' cho NULL. – trante

+2

Sử dụng' 'entry.getValue()' 'tốt hơn' 'entry.getValue(). toString()' 'không để nhận NullPointerException) –

7

tôi nghĩ câu hỏi có nhiều việc phải làm với lý do tại sao

PreferenceManager.getDefaultSharedPreferences(this).getAll() 

được trả lại một bản đồ trống/mâu thuẫn so với làm thế nào để lặp qua một bản đồ chuẩn java. các android doc là không thực sự tinh thể rõ ràng về những gì đang xảy ở đây nhưng về cơ bản nó có vẻ như cuộc gọi đầu tiên bao giờ để

PreferenceManager.setDefaultValues(this, R.xml.preferences,false) 

- đó là những gì bạn đang nghĩ để gọi để khởi tạo sở thích khi bạn khởi động ứng dụng của bạn - tạo ra một số loại phiên bản được lưu trong bộ nhớ cache của các tùy chọn của bạn gây ra các thay đổi trong tương lai đối với tệp tùy chọn xml của bạn được xử lý không nhất quán, tức là gây ra sự không khớp mà bạn đã mô tả trong câu hỏi của mình.

để thiết lập lại này "thực thể lưu trữ", hãy làm theo các bước sau (mà bạn có thể loại đưa ra từ liên kết ở trên):

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.edit().clear(); 
    PreferenceManager.setDefaultValues(this, R.xml.preferences, true); 
+0

giải pháp tôi cần là kết hợp của câu trả lời này và http://stackoverflow.com/a/9310697/1815624 – CrandellWS

Các vấn đề liên quan