Как проверить, существует ли файл SharedPreferences или нет

Я ищу общие настройки Android, и мне интересно, есть ли способ просто проверить, существует ли файл настроек.

   SharedPreferences  mySharedPreferences ; 
mySharedPreferences=getSharedPreferences(“Name_of_your_preference”,mode);

Этот приведенный выше код заставляет меня поверить, что «Name_of_Your_preferene» хранится в виде файла или какого-то контейнера, который будет содержать ваши предпочтения.

Мне интересно, есть ли там, чтобы проверить, существует ли это или нет. Когда пользователь загружает действие, я хочу сохранить все настройки в этот файл с некоторыми значениями по умолчанию (отключено для всех настроек). Однако я хочу сделать это только в том случае, если они заходят на страницу в первый раз.

В противном случае, если бы я делал что-то подобное каждый раз, когда страница загружается

SharedPreferences.Editor editor= mySharedPreferences.edit();

/* now store your primitive type values. In this case it is true, 1f and Hello! World  */

editor.putBolean(“myBoolean”,true);

editor.putFloat(“myFloat”,1f);

editor.putString(“myString”,” Hello! World”);

Я предполагаю, что это отменит все настройки, даже те, которые они установили.


person chobo2    schedule 05.08.2011    source источник


Ответы (7)


SharedPreferences сохраняются в файле xml. Вы можете найти его в /data/data/your_application_package/shared_prefs/Name_of_your_preference.xml

Чтобы проверить, существуют ли SharedPreferences 'Name_of_your_preference':

File f = new File(
"/data/data/your_application_package/shared_prefs/Name_of_your_preference.xml");
if (f.exists())
    Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
else
    Log.d("TAG", "Setup default preferences");

С Уважением.

person FinalSpirit    schedule 05.08.2011
comment
Так что я просто просматривать там через эмулятор? - person chobo2; 06.08.2011
comment
как попасть в эту папку - person meda; 28.08.2013
comment
f.exists() приводил к сбою моего приложения. даже после добавления try catch исключение не было перехвачено. Он просто разбился. - person arun8; 11.08.2017
comment
новый файл (/data/data/your_application_package/shared_prefs/Name_of_your_preference.xml); Это всегда будет оцениваться как true, за исключением случаев, когда оно выдает исключение, верно? Потому что вы создаете новый файл, не проверяя, существовал ли он ранее. Примечание: это вопрос с мыслью. - person Curtes Malteser; 21.04.2020
comment
new File() не будет создавать новый файл. Чтобы создать файл, это f.createNewFile(). - person FinalSpirit; 25.07.2020

Вы можете использовать метод contains для объекта SharedPreferences, чтобы проверить, существует ли в файле один из ваших ключей предпочтений. Если это возвращает false, вы можете предположить, что это первый раз, и заполнить настройки по умолчанию. Документация по этому методу находится здесь.

Я не смог найти способа проверить, существует ли уже файл настроек (он будет создан автоматически при первом вызове редактора), но этот метод должен сработать.

person Eugene S    schedule 05.08.2011
comment
как насчет того, чтобы использовать getAll(), так как он будет получать предпочтения только из права Name_of_your_preference? Итак, если бы счет был равен нулю, я думаю, он не был бы создан? - person chobo2; 06.08.2011
comment
Тоже должно работать. Я полагаю, это вопрос предпочтений, но в случае getAll() вам придется создать экземпляр объекта Map только для проверки его размера. Оригинальный метод кажется более быстрым логическим тестом. - person Eugene S; 06.08.2011
comment
Я использую монодроид. У него есть функция подсчета, поэтому я думаю, что со мной все в порядке. - person chobo2; 06.08.2011

Мне не хватило представителей, чтобы прокомментировать пост natur3. Поэтому этот ответ.

@natur3: Очень полезно, спасибо. Однако у меня была небольшая проблема... с суффиксом файла. Если я определяю свое имя файла следующим образом:

    private static final String FILENAME = "myPrefs";

А затем используйте:

    File f = new File("/data/data/" + getPackageName() +  "/shared_prefs/" + FILENAME);

f.exists() вернет false, даже если файл существует в файловой системе. Это связано с тем, что Android автоматически добавит суффикс «.xml» при написании SharedPreferences, поэтому мне пришлось сделать ссылку на файл такой:

    File f = new File("/data/data/" + getPackageName() +  "/shared_prefs/" + FILENAME + ".xml");

чтобы это работало. Я не знаю, откуда у вас суффикс «_preferences.xml».

Мне удалось выяснить это, просмотрев файловую систему эмулятора в Eclipse, используя Window->Show View->Other... и затем выбрав «Проводник».

person TiredDude    schedule 08.12.2013

Вместо жесткого кодирования пути «/data/data/» вы можете сделать это:

public boolean preferenceFileExist(String fileName) {
    File f = new File(getApplicationContext().getApplicationInfo().dataDir + "/shared_prefs/"
            + fileName + ".xml");
    return f.exists()
}
person pbm    schedule 20.08.2016
comment
Примечание. getApplicationInfo().dataDir возвращает /data/user/0 в новых версиях Android. - person Abandoned Cart; 23.08.2018

Я сделал это таким образом, чтобы его можно было адаптировать.

File f = new File("/data/data/" + getPackageName() +  "/shared_prefs/" + getPackageName()+ "_preferences.xml");

if(f.exists())
{ 
     //do stuff`enter code here`
}

Я использовал это в процессе проверки в onCreate, существуют ли настройки или нет, и в зависимости от ответа включите кнопку, чтобы очистить настройки или нет - просто проверьте, какое имя у вашего файла настроек в DDMS, если он не назван вручную.

person natur3    schedule 26.05.2013
comment
Привет, natur3, Не следует ли читать путь к файлу: File f = new File(/data/data/ + getPackageName() + /shared_prefs/_preferences.xml); без второго getPackageName()? Когда я использовал ваш код, он попал в несуществующий каталог и поэтому не сохранился. - person Dan Tarlow; 03.07.2015

Самый простой способ, который я нашел, мы можем проверить, существуют ли общие настройки с помощью встроенного кода на Android.

 sharePrefName.contains(String key) // as if (userData.contains("name")){Toast // Your data is already here!}

Проверяет, содержат ли предпочтения предпочтения. (это абстрактный логический общедоступный метод)

Просто и легко :)

person Kerelos    schedule 27.03.2017

Это кажется более точным решением

val file = File(filesDir.parent, "shared_prefs/name_of_preference.xml")

или просто

val file = File(filesDir, "../shared_prefs/name_of_preference.xml")
person Vlad    schedule 08.02.2021