Как очистить старые настройки при обновлении приложения Android?
У меня есть приложение на рынке Google Play. По различным причинам, в которые я не буду вдаваться, я изменил тип некоторых моих предпочтений. Например, тип предпочтения был Integer, а в самой последней версии теперь это String. Я думаю, что это не очень хорошая практика, но, к сожалению, я должен был это сделать.
Меня беспокоит, что когда кто-то обновляется до новой версии, их приложение будет разбиваться по мере изменения типов предпочтений. По этой причине я хотел бы очистить настройки всякий раз, когда приложение обновляется (опять же я понимаю, что это не идеально!)
Возможно ли это?
Ответы
Ответ 1
Класс SharedPreferences.Editor
имеет функцию clear()
, которая удаляет все ваши сохраненные настройки (после commit()
). Вы можете создать логический флаг, который будет указывать, если обновление необходимо:
void updatePreferences() {
SharedPreferences prefs = ...;
if(prefs.getBoolean("update_required", true)) {
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
/*....make the updates....*/
editor.putBoolean("update_required", false)
editor.commit();
}
}
И после этого вам нужно вызвать это в вашем основном (первом запуске) действии, прежде чем вы получите доступ к каким-либо предпочтениям.
РЕДАКТИРОВАТЬ:
Чтобы получить текущую версию (код версии, объявленный в манифесте):
int version = 1;
try {
version = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if(version > ...) {
//do something
}
РЕДАКТИРОВАТЬ
Если вы хотите выполнить какую-либо операцию обновления, всякий раз, когда изменяется версия, вы можете сделать что-то вроде этого:
void runUpdatesIfNecessary() {
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
SharedPreferences prefs = ...;
if (prefs.getInt("lastUpdate", 0) != versionCode) {
try {
runUpdates();
// Commiting in the preferences, that the update was successful.
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("lastUpdate", versionCode);
editor.commit();
} catch(Throwable t) {
// update failed, or cancelled
}
}
}
Ответ 2
Вы также можете добавить номер версии при получении SharedPreferences, подобный этому
context.getSharedPreferences("MyKey" + app_version_no, Context.MODE_PRIVATE);
Итак, если вы обновите приложение, номер версии изменится, и у вас будет новый набор настроек.
Ответ 3
Сохраните код версии по умолчанию SharedPreferences И сохраните ваши другие настройки в указанном файле версии, при изменении версии вы можете найти свой старый код версии, и у вас может быть старый файл предпочтений и обновить новую версию старыми данными.
int versionCode=0,oldVersion;
try
{
versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
}
catch (PackageManager.NameNotFoundException e)
{}
SharedPreferences prefs =getSharedPreferences("MyPref" + versionCode, Context.MODE_PRIVATE);
SharedPreferences prefsDefault = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
oldVersion=prefsDefault.getInt("OldVersion",0);
if (oldVersion!=versionCode)
{
if (oldVersion>0)
{
// ToDo Update Preferences
String oldPrefsKey="MyPref" + oldVersion;
SharedPreferences oldPrefs =context.getSharedPreferences(oldPrefsKey, Context.MODE_PRIVATE);
SharedPreferences.Editor pEdit=prefs.edit();
pEdit.putBoolean("clock24",oldPrefs.getBoolean("clock24",false));
pEdit.putBoolean("show_clock",oldPrefs.getBoolean("show_clock",true));
pEdit.commit();
oldPrefs.edit().clear().commit();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
deleteSharedPreferences(oldPrefsKey);
} else {
try {
File oldFile=new File(getCacheDir().getParent() + "/shared_prefs/"+oldPrefsKey+".xml");
oldFile.delete();
} catch (Exception e) {
}
}
}
prefsDefault.edit().putInt("OldVersion",versionCode).commit();
}
Ответ 4
final String PREFERENCE_NAME = "my_preference";
final String APP_VERSION_CODE = 6; /*change this each time you want to clear
preference in updated app.*/
preferences = getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE);
if (preferences.getInt(PREFERENCE_VERSION, 0) != APP_VERSION_CODE) {
preferences.edit().clear().apply();
preferences.edit().putInt(PREFERENCE_VERSION, APP_VERSION_CODE).apply();
}