Як отримати всі ключі SharedPreferences програмно в Android?


77

Як отримати всі ключі SharedPreferences, а не значення переваги лише ключ?

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

1
Ви маєте на увазі всі ключі своїх уподобань або імена уподобань?
Ніко

моє питання полягає в тому, як отримати всі уподобання, визначені назвою, а не значення того, що всередині налаштувань, тому що ви можете встановити ім'я преф, якщо хочете, так що, якщо ви створите багато імен уподобань, а не значення всередині уподобання, проблема це те, як отримати всі заявлені імена пріоритетів. не значення преференцій всередині преференції
Піоло Опав

Відповіді:


188

SharedPreferencesмає метод, getAll()який повертає a Map<String, ?>. За допомогою Карти Ви можете легко отримати ключі за допомогою keySet()та відображення ключів / значень за допомогою entrySet():

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

3
Я запитав Google про це питання, і мені відразу вказали на цю відповідь, і я взяв близько 2,1 сек, щоб знайти відповідь. Дякую товаришу!
Sindri Þór

1
хтось знає, чому це може призвести до викиду NullPointerException?
Кушань

2
@kushan, карта приймає нульові значення. toString може спричинити NPE, і це не потрібно. Оператор plus вже піклується про конверсію toString
Blackbelt

16

Що ви можете зробити, це скористатися методом getAll () SharedPreferences і отримати всі значення в Map, а потім ви можете легко їх переглядати:

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

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

Щоб дізнатись більше, ви можете перевірити реалізацію dum () PrefUtil.java за цим посиланням .



7

Kotlin дозволить вам отримати всі ваші ключі SharedPreferences лише одним рядком за допомогою Map .

Вітайте пару 🎉

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

4

Перевірте наведений нижче код для getAll()методу

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

2

Прочитавши відповідь @Delacrix та погравши з Kotlin-способом (протестований у Kotlin 1.3.11) отримання ключів, я виявив ще коротшу версію для отримання ключів (або навіть значень):

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

Таким же чином ви можете отримати доступ лише до значень через sharedPreferences.all.values(навіть tho - це не те, що ви задали у своєму запитанні, може бути корисним для інших читачів).


1

Хоча відповідь @ Blackbelt тут досить популярна, я думаю, що вона насправді не націлена на це питання. (Це не дивно, оскільки питання змішує термінологію імен і ключів уподобань.) Думаю, питання полягає в тому, як дізнатись, які екземпляри спільних уподобань були створені - що може зацікавити, якщо імена створюються динамічно.

Ось дві стратегії для цього:

  • створити інший екземпляр "мета" спільних уподобань, де всі створені екземпляри спільних префенсів реєструються, додавши пару ключ / значення для нього до мета преф true.

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

    Щоб отримати всі створені вами спільні префенці, використовуйте мета-префикси та дотримуйтесь відповіді @Blackbelt.

  • у спільних налаштуваннях є файл резервної копії, який зберігається у папці /data/data/YOUR_PACKAGE_NAME/shared_prefsз ім’ям. YOUR_PREFS_NAME.xml Таким чином, ви можете переглянути цей каталог для файлів спільних налаштувань. Але будьте обережні, можуть бути спільні файли налаштувань, які не були створені за вашою логікою! Тому я б дотримувався першого підходу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.