Удалить файл SharedPreferences

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

Мой вопрос: «Как я могу удалить в коде или вручную (не просто очистить) файл SharedPreferences


person Andrew    schedule 25.05.2011    source источник
comment
Вы пробовали метод clear(). Я думаю, что это на самом деле предназначено для удаления всех значений, хранящихся в общих настройках. Поэтому, как только вы укажете, что вашим пользователям будет предоставлено значение по умолчанию для общего предпочтения.   -  person Andro Selva    schedule 25.05.2011
comment
clear() очистит файл, но не удалит его из файловой системы. Плохо разработанное приложение (например, мое) может содержать множество пустых файлов, занимающих место. Мне кажется, что метод @kirill и @inazaruk работает.   -  person Richard Le Mesurier    schedule 17.07.2013


Ответы (5)


Если вы получите экземпляр SharedPreferences через Context.getSharedPreferences("X"), то ваш файл будет называться X.xml.

Он будет расположен по адресу /data/data/com.your.package.name/shared_prefs/X.xml. Вы можете просто удалить этот файл из папки. Также проверьте файл /data/data/com.your.package.name/shared_prefs/X.bak и, если он существует, тоже удалите его.

Но имейте в виду, что экземпляр SharedPreferences сохраняет все данные в памяти. Поэтому вам нужно сначала очистить настройки, зафиксировать изменения и только затем удалить резервный файл настроек.

Этого должно быть достаточно для реализации вашего дизайнерского решения.

person inazaruk    schedule 25.05.2011
comment
О, значит, даже если я просто удалю файл, не очистив его, данные все равно будут занимать память? Кроме того, не могли бы вы указать мне на учебник или что-то, что показывает, как перейти в каталог и удалить файл. Спасибо - person Andrew; 25.05.2011
comment
Да, он может хранить данные в памяти некоторое время. Он может обнаружить, что файл был удален, и очиститься, но я бы не рекомендовал полагаться на это. Что касается удаления файлов, см. документацию: developer .android.com/reference/java/io/. Это довольно просто: File file= new File("/data/data/.../shared_prefs/X.xml");, а затем file.delete(); - person inazaruk; 25.05.2011
comment
Вы можете программно удалить файл общих настроек на немаршрутизируемых устройствах? - person Paul; 27.09.2012
comment
Ответ на мой вопрос выше: НЕТ. - person Paul; 28.09.2012
comment
@Paul Программное удаление, похоже, работает для меня (Nexus 7, не рутированное, подписанное приложение). Но еще не проверил приложение, отправленное в магазин ... - person Richard Le Mesurier; 17.07.2013
comment
Вы должны иметь возможность удалять файлы настроек. Все файлы настроек создаются с UID вашего приложения в качестве владельца. Итак, ваше приложение имеет все необходимые разрешения. - person inazaruk; 17.07.2013
comment
Вместо того, чтобы жестко кодировать путь, вы можете использовать context.getFilesDir().getParent() + File.separator + "shared_prefs" (каталог файлов является родственным каталогу shared_prefs). - person arlomedia; 02.08.2014
comment
Кажется, это не работает для меня. Вернее, удаление файла, по-видимому, проходит нормально... Я получаю положительный результат от file.delete()... но потом, когда я после этого проверяю содержимое общей папки prefs, файл все еще там :-/ - person drmrbrewer; 24.06.2020
comment
Если удалить == true, файл все еще существует - person ilw; 05.01.2021

Вот простой способ очистить все SharedPreferences для данного контекста, полезный для модульных тестов.

public static void clearSharedPreferences(Context ctx){
    File dir = new File(ctx.getFilesDir().getParent() + "/shared_prefs/");
    String[] children = dir.list();
    for (int i = 0; i < children.length; i++) {
        // clear each preference file
        ctx.getSharedPreferences(children[i].replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
        //delete the file
        new File(dir, children[i]).delete();
    }
}

Обратите внимание, что когда вы используете это для модульного тестирования Android и используете общие настройки в своем классе Application, это может вызвать состояние гонки и может работать неправильно.

person Kirill Kulakov    schedule 01.07.2013
comment
Лучший ответ, который я нашел до сих пор - person Marco; 23.05.2016

Это просто Гений!

Ваш путь к файлу sd-карты preference.xml по умолчанию может быть следующим: /data/data/your package name/shared_prefs/your XML-файл общих настроек.

например, /data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml.

удалить XML-файл настроек:

File deletePrefFile = new File("/data/data/com.hirecraft.hirecraftmanager/shared_prefs/swipe_preferences.xml");
deletePrefFile.delete();

Или получить путь к файлу в строке, например,

String filePath = getApplicationContext().getFilesDir().getParent()+"/shared_prefs/swipe_preferences.xml";
File deletePrefFile = new File(filePath );
 deletePrefFile.delete();
person Community    schedule 07.12.2013
comment
2-й вариант неверный. getApplicationContext().getFilesDir().getPath()+/+shared_prefs/ ведет к /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/swipe_preferences.xml !!! Папка shared_prefs не находится в папке с файлами. Понижение за 2-й вариант. - person goseib; 22.03.2015
comment
2-й вариант неверный. getApplicationContext().getFilesDir().getPath()+/+shared_prefs/ ведет к /data/data/com.hirecraft.hirecraftmanager/files/shared_prefs/swipe_preferences.xml !!! Папка shared_prefs не находится в папке с файлами. Замените getPath() на getParent(). Понижение из-за вашего недружелюбного отношения! - person goseib; 22.03.2015

Джава:

public static boolean deleteSharedPreferences(Context context, String name) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return context.deleteSharedPreferences(name);
    } else {
        context.getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply();
        File dir = new File(context.getApplicationInfo().dataDir, "shared_prefs");
        return new File(dir, name + ".xml").delete();
    }
}

Котлин:

companion object {
    fun deleteSharedPreferences(context: Context, name: String): Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return context.deleteSharedPreferences(name)
        } else {
            context.getSharedPreferences(name, MODE_PRIVATE).edit().clear().apply()
            val dir = File(context.applicationInfo.dataDir, "shared_prefs")
            return File(dir, "$name.xml").delete()
        }
    }
}
person ElegyD    schedule 21.05.2021

person    schedule
comment
Что такое FileUtils? - person azizbekian; 28.05.2019
comment
@azizbekian FileUtils служебный класс из библиотеки Apache Commons IO. implementation 'commons-io:commons-io:2.6 - person hasnain_ahmad; 28.11.2019