15

GooglePlayマーケットにアプリを持っています。わざわざ入らないさまざまな理由で、いくつかの好みのタイプを変更しました。たとえば、設定タイプは整数でしたが、最新バージョンでは文字列になりました。これは良い習慣ではないと思いますが、残念ながら私はそれをしなければなりませんでした。

私の懸念は、誰かが新しいバージョンに更新すると、設定タイプが変更されたためにアプリがクラッシュすることです。このため、アプリが更新されるたびに設定をクリアしたいと思います(これも理想的ではないことに気づきました!)

これは可能ですか?

4

4 に答える 4

19

この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
        }
    }
}
于 2012-09-12T04:04:43.910 に答える
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();
}
于 2017-10-18T09:15:15.357 に答える
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();




    }
于 2017-06-19T07:48:40.573 に答える
-1

このようなSharedPreferencesを取得しながら、バージョン番号を追加することもできます

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

そのため、アプリを更新すると、バージョン番号が変更され、新しい設定セットが作成されます。

于 2016-08-20T06:10:43.957 に答える