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

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

   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");

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

Ответ 1

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");

С уважением.

Ответ 2

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

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

Ответ 3

У меня не хватило повторений, чтобы комментировать 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... и затем выберите "File Explorer".

Ответ 4

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

public boolean preferenceFileExist(String fileName) {
    File f = new File(getApplicationContext().getApplicationInfo().dataDir + "/shared_prefs/"
            + fileName + ".xml");
    return f.exists()
}

Ответ 5

Я сделал это так, чтобы его адаптируемое imo.

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

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

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

Ответ 6

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

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

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

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