Можно ли получить объект общих настроек, если известна только часть имени?

Обратите внимание, что этот вопрос НЕ касается получения содержимого объекта SharedPreferences, если ключи неизвестны, он касается возможности получения самих SharedPreferences, если его имя неизвестно.

Предположим, что есть коллекции SharedPreferences с именами файлов "something-a", "something-b", "something-c". Тогда можно ли определить, что доступно 3 набора объектов SharedPreferences, и иметь возможность получить их, когда известна только «что-то-» часть их имени?

Я думаю, что нет, но надеюсь, что есть.

Я не буду вдаваться в причины этого требования, за исключением того, что необходимо обновить приложение до модели разрешений Marshmallows, и оно должно иметь возможность читать файлы настроек, написанные более старыми версиями приложения, где имя настроек — «что-то». -имси». Если пользователь не предоставил соответствующее разрешение на Marshmallow, тогда приложение не знает imsi, и поэтому я пытаюсь выяснить, возможно ли для приложения прочитать общие настройки, когда оно не знает полного имени.


person Gruntcakes    schedule 14.10.2015    source источник
comment
Я думаю, что это сделает то, что я искал stackoverflow.com/questions/14580085/   -  person Gruntcakes    schedule 15.10.2015


Ответы (2)


Вы можете получить все настройки с помощью SharedPreferences.getAll() и перебрать эту коллекцию для строковых ключей, соответствующих вашему шаблону. Например:

SharedPreferences prefs = ctx.getSharedPreferences(PREFS_NAME, 0);
Map<String, ?> pairs = prefs.getAll();
for (Map.Entry<String, ?> entry : pairs.entrySet()) {
    // Check for your string pattern here...
}

Этот ответ предполагает, что у вас есть один общий файл настроек с ключами, соответствующими шаблону, описанному в вопросе. Если это не так, и у вас есть несколько общих файлов настроек с динамическими именами, соответствующих шаблону, это более сложная проблема. Вы можете добиться некоторого прогресса, перебирая файлы в Context.getFilesDir().

person x-code    schedule 14.10.2015
comment
ОП спросил, может ли он выяснить, нет ли разных файлов настроек. - person pgiitu; 15.10.2015
comment
Спасибо, но вопрос не в том, как получить содержимое объекта SharedPeferences, а в том, как получить этот объект, если его имя неизвестно. - person Gruntcakes; 15.10.2015
comment
Я вижу это сейчас. Как говорится в отредактированном ответе, это более сложная проблема. Если вы действительно заинтересованы в решении проблемы, см. источник Context.java: android.googlesource.com/platform/frameworks/base/+/refs/heads/ Хотя содержащийся в нем метод getSharedPrefsFile скрыт, его можно доступ с использованием отражения Java, и вы идете оттуда... - person x-code; 15.10.2015
comment
Спасибо, я посмотрю на это. - person Gruntcakes; 15.10.2015

Я не думаю, что можно получить список имен файлов доступных настроек. Хотя, если вы знаете имя файла, вы можете получить экземпляр SharedPreferences и использовать метод getAll, чтобы получить все ключи, присутствующие в этом наборе настроек.

Вот документация: https://developer.android.com/reference/android/content/SharedPreferences.html#getAll()

Пример:

    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, 0);
    Map<String, ?> map = sharedPreferences.getAll();
    for (Map.Entry<String, ?> e : map.entrySet()) {
        String key = e.getKey();
        // this is the key that is present
    }
person pgiitu    schedule 14.10.2015
comment
Спасибо, но вопрос не в том, как получить содержимое объекта SharedPeferences, а в том, как получить этот объект, если его имя неизвестно. - person Gruntcakes; 15.10.2015