我在 Google Play 市场上有一个应用程序。由于各种原因,我不会费心去讨论,我已经改变了我的一些偏好的类型。例如,首选项类型是整数,而在最新版本中,它现在是字符串。我想这不是一个好的做法,但不幸的是我不得不这样做。
我担心的是,当有人更新到新版本时,他们的应用程序会因为偏好类型的变化而崩溃。出于这个原因,我想在应用程序更新时清除首选项(我再次意识到不理想!)
这可能吗?
我在 Google Play 市场上有一个应用程序。由于各种原因,我不会费心去讨论,我已经改变了我的一些偏好的类型。例如,首选项类型是整数,而在最新版本中,它现在是字符串。我想这不是一个好的做法,但不幸的是我不得不这样做。
我担心的是,当有人更新到新版本时,他们的应用程序会因为偏好类型的变化而崩溃。出于这个原因,我想在应用程序更新时清除首选项(我再次意识到不理想!)
这可能吗?
该类SharedPreferences.Editor
有一个clear()
功能,它会删除所有存储的首选项(在 a 之后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();
}
}
之后,您需要在您的主要(第一次开始)活动中调用它,然后才能访问任何首选项。
编辑:
要获取当前版本(清单中声明的 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 {
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
}
}
}
final String PREFERENCE_NAME = "my_preference";
final String APP_VERSION_CODE = 6; /* increase this if 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();
}
将版本代码存储在默认的 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();
}
您还可以在像这样获取 SharedPreferences 时附加版本号
context.getSharedPreferences("MyKey" + app_version_no, Context.MODE_PRIVATE);
因此,如果您更新应用程序,版本号将发生变化,您将拥有一组新的偏好。