问题 更新Android应用时如何清除旧的首选项?


我在Google Play市场上有一款应用。由于各种原因,我不打算进入,我已经改变了我的一些偏好的类型。例如,首选项类型是Integer,在最新版本中它现在是String。我想这不是一个好习惯,但不幸的是我不得不这样做。

我担心的是,当有人更新新版本时,他们的应用会因偏好类型发生变化而崩溃。出于这个原因,我想在应用程序更新时清除首选项(再次,我意识到不理想!)

这可能吗?


5754
2017-09-12 03:52


起源



答案:


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

之后,在访问任何优先级之前,您需要在主(首次启动)活动中调用此方法。

编辑

要获取当前版本(清单中声明的​​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
        }
    }
}

15
2017-09-12 04:04



是否可以判断用户何时决定从Google Play市场进行更新? - Mel
这正是这段代码的作用:如果版本是新版本,那么你就会知道用户决定进行更新 - Phate
这不是一个非常美妙的做事方式,但你也可以开始在共享偏好中存储当前版本,当它与你的应用程序的实际版本不匹配时(如上所示,如何获得它),你也可以做一点事。 - Balázs Édes


答案:


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

之后,在访问任何优先级之前,您需要在主(首次启动)活动中调用此方法。

编辑

要获取当前版本(清单中声明的​​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
        }
    }
}

15
2017-09-12 04:04



是否可以判断用户何时决定从Google Play市场进行更新? - Mel
这正是这段代码的作用:如果版本是新版本,那么你就会知道用户决定进行更新 - Phate
这不是一个非常美妙的做事方式,但你也可以开始在共享偏好中存储当前版本,当它与你的应用程序的实际版本不匹配时(如上所示,如何获得它),你也可以做一点事。 - Balázs Édes


您也可以在获取此类SharedPreferences时附加版本号

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

因此,如果您更新应用程序,版本号将会更改,您将拥有一组新的首选项。


1
2017-08-20 06:10



这将导致数据存储量不断增长.. - baash05


将版本代码存储在默认的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();




    }

0
2018-06-19 07:48





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

0
2017-10-18 09:15