2012-09-12 17 views
9

Google Playマーケットにアプリがあります。私が入るのを嫌う様々な理由から、私はいくつかの好みのタイプを変更しました。たとえば、プリファレンスタイプはIntegerであり、最新のバージョンでは現在はStringになっています。私はこれが良い習慣ではないと思いますが、残念ながら私はそれをしなければなりませんでした。Androidアプリのアップデート時に古い設定を消去するにはどうすればよいですか?

私の懸念は、誰かが新しいバージョンに更新すると、プリファレンスタイプが変更されたときにアプリがクラッシュすることです。この理由から、私はアプリが更新されるたびに環境設定をクリアしたいと思います(もう一度私は理想的ではありません!)

これは可能ですか?

答えて

14

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

その後、あなたはどんなpreferenesにアクセスする前に、あなたのメインの(最初の起動)の活動でこれを呼び出す必要があります:あなたは必要な更新した場合を示しますブールフラグを作成することができます。

現在のバージョンを取得するには(versionCodeがマニフェストで宣言された)

EDIT:

int version = 1; 
try { 
    version = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 
} catch (NameNotFoundException e) { 
    e.printStackTrace(); 
} 

if(version > ...) { 
    //do something 
} 

EDIT

あなたには、いくつかの更新作業を行いたい場合は、いつでもバージョンを変更すると、次のようなことができます。

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 
     } 
    } 
} 
+0

ユーザーがGoogle Playマーケットから更新を行うことを決定することはできますか? – Mel

+0

これはまさにこのコードがしていることです:バージョンが新しいものであれば、ユーザーは更新を行うことにしました – Phate

+0

これは本当に美しい方法ではありませんが、現在のバージョンをsharedpreferences、それがあなたのアプリの実際のバージョン(上記のように、それを得る方法)と一致しないときは、何かをすることもできます。 –

1

アプリを更新した場合ので、バージョン番号が変更されます。この

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

ようSharedPreferencesを取得しているときは、バージョン番号を追加することができますし、好みの新しいセットを持っています。

+0

これは、ますます増大するデータストアになります。 – baash05

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(); 
} 
関連する問題