更新Android应用程序时如何清除旧的偏好?

我在Google Play市场上有一个应用程序。 由于各种原因,我不打扰进入,我已经改变了我的一些偏好的types。 例如,一个首选types是一个Integer,而在最近的版本中它现在是一个String。 我想这不是好的做法,但不幸的是我必须这样做。

我担心的是,当有人更新到新版本时,他们的应用程序将随着偏好types的改变而崩溃。 出于这个原因,我想清除应用程序更新时的偏好(我再次意识到不理想!)

这可能吗?

Solutions Collecting From Web of "更新Android应用程序时如何清除旧的偏好?"

SharedPreferences.Editor类有一个clear()函数, SharedPreferences.Editor删除所有存储的首选项(在commit() )。 你可以创build一个布尔型标志来指示是否需要更新:

 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(); } } 

之后,您需要在主要(第一次启动)活动中调用此函数,然后才能访问任何前提条件。

编辑

获取当前版本(在清单中声明的​​versionCode):

 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 { runUpddates(); // 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 } } } 

你也可以在获得这样的SharedPreferences的同时附加版本号

 context.getSharedPreferences("MyKey" + app_version_no, Context.MODE_PRIVATE); 

所以,如果你更新的应用程序,版本号将改变,你会有一套新的偏好。

将版本代码存储在默认的SharedPreferences中,并将您的其他偏好存储在版本指定的文件中,当版本更改时,您可以find旧的版本代码,并且可以使用旧的偏好文件并使用旧数据更新新版本

 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(); } 
 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(); }