2012-09-12 16 views
9

Google Play pazarında bir uygulamanız var. Gittiğim rahatsız edici çeşitli nedenlerden dolayı, bazı tercihlerimin türünü değiştirdim. Örneğin bir tercih türü Tamsayı idi ve en son sürümde artık bir String'dir. Bunun iyi bir uygulama olmadığını hayal ediyorum ama maalesef bunu yapmak zorundaydım.Android uygulamasını güncellerken eski tercihler nasıl temizlenir?

Sorunum, birisi yeni sürüme güncellendiğinde, tercih türleri değiştikçe uygulamalarının çökmesidir. Bu nedenle, uygulama güncellendiğinde tercihleri ​​temizlemek istiyorum (yine ideal değil!)

Bu mümkün mü?

cevap

14

SharedPreferences.Editor sınıfında, tüm kayıtlı tercihlerinizi (commit()'dan sonra) kaldıran bir clear() işlevi vardır. Gerektiğinde güncelleme eğer gösterecektir bir boolean bayrak oluşturabilirsiniz:

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

Ve herhangi preferenes erişmeden önce bundan sonra, ana (ilk başlangıç) aktivitesinde bu çağırmanız gerekiyor.

güncel sürümünü almak için (versionCode manifest'te ilan)

DÜZENLEME:

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

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

DÜZENLEME

bazı güncelleme işlemini yapmak istiyorsanız, her ne zaman sürüm değişiklikleri, daha sonra aşağıdaki gibi bir şey yapabilirsiniz:

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

Kullanıcının Google Play pazarından bir güncelleme yapmaya ne zaman karar verdiğini söylemek mümkün mü? – Mel

+0

Tam olarak bu kodun yaptığı şey şu: eğer sürüm yeni olacaksa o zaman kullanıcının bir güncelleme yapmaya karar verdiğini biliyorsunuz. – Phate

+0

Bu, işleri yapmak için gerçekten güzel bir yol değil, aynı zamanda mevcut sürümü kaydetmeye de başlayabilirsiniz. paylaşılanlar ve uygulamanızın gerçek sürümü (yukarıda gösterildiği gibi) ile eşleşmediğinde, bir şeyler de yapabilirsiniz. –

1

uygulamayı güncellemeniz Yani, sürüm numarası değişecek bu

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

gibi SharedPreferences alınırken Ayrıca sürüm numarasını ekleyebilirsiniz ve tercihler yeni bir dizi olacaktır. Varsayılan SharedPreferences içinde

+0

Bu, giderek büyüyen bir veri deposuna neden olur. – baash05

0

Store sürümü kodu VE sürüm değişikliği size eski sürüm kodu bulduğunuz zaman, sürüm belirtilen dosyada diğerleri tercihlerini saklamak ve eski tercihi dosyası var ve eski verilerle yeni sürümü güncelleyebilirsiniz

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