【问题标题】:How to clear old preferences when updating Android app?更新 Android 应用程序时如何清除旧的偏好?
【发布时间】:2021-05-26 15:50:01
【问题描述】:

我在 Google Play 市场上有一个应用程序。由于各种原因,我不会费心去讨论,我已经改变了我的一些偏好的类型。例如,首选项类型是整数,而在最新版本中,它现在是字符串。我想这不是一个好的做法,但不幸的是我不得不这样做。

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

这可能吗?

【问题讨论】:

    标签: android sharedpreferences preferences


    【解决方案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();
        }
    }
    

    然后,您需要在您的主要(第一次启动)活动中调用它,然后才能访问任何首选项。

    编辑:

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

    【讨论】:

    • 是否可以判断用户何时决定从 Google Play 市场进行更新?
    • 这正是这段代码所做的:如果版本是新的,那么你就会知道用户决定进行更新
    • 这不是一种非常漂亮的做事方式,但您也可以开始将当前版本存储在 sharedpreferences 中,当它与您的应用程序的实际版本不匹配时(如上所示,如何得到它),你也可以做点什么。
    【解决方案2】:
    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();
    }
    

    【讨论】:

      【解决方案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】:

        你也可以在获取 SharedPreferences 时附加版本号

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

        因此,如果您更新应用程序,版本号将发生变化,您将拥有一组新的偏好。

        【讨论】:

          猜你喜欢
          • 2012-04-29
          • 2011-04-21
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多