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

问题描述 投票:14回答:4

我有谷歌播放市场上的应用程序。对于我不会打扰进入各种原因,我已经改变了我的一些喜好的类型。例如偏好类型是一个整数,在最近的版本它现在是一个字符串。我想这是不好的做法,但不幸的是我不得不这样做。

我担心的是,当有人更新到新版本他们的应用程序会崩溃的偏好类型发生了变化。为此,我想清楚,每当应用程序更新偏好(我再次意识到不理想!)

这可能吗?

android sharedpreferences preferences
4个回答
18
投票

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 {
            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
        }
    }
}

0
投票

您还可以追加版本号,而越来越喜欢这个SharedPreferences

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

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


0
投票

在默认情况下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
投票
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.