2012-09-12 26 views
9

मेरे पास Google Play बाजार पर एक ऐप है। विभिन्न कारणों से मैं जाने में परेशान नहीं होंगे, मैंने अपनी कुछ प्राथमिकताओं को बदल दिया है। उदाहरण के लिए एक वरीयता प्रकार एक इंटीजर था और हाल के संस्करण में अब यह एक स्ट्रिंग है। मुझे कल्पना है कि यह अच्छा अभ्यास नहीं है लेकिन दुर्भाग्य से मुझे यह करना पड़ा।एंड्रॉइड ऐप अपडेट करते समय पुरानी प्राथमिकताओं को कैसे साफ़ करें?

मेरी चिंता यह है कि जब कोई नया संस्करण अपडेट करता है तो उनका ऐप क्रैश हो जाएगा क्योंकि प्राथमिकता प्रकार बदल गए हैं। इस कारण से जब भी ऐप अपडेट किया जाता है तो मैं वरीयताओं को साफ़ करना चाहता हूं (फिर से मुझे आदर्श नहीं लगता!)

क्या यह संभव है?

उत्तर

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 प्रकट में घोषित):

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

अपडेट करने का निर्णय लिया है, यह चीजों को करने का वास्तव में सुंदर तरीका नहीं है, लेकिन आप वर्तमान संस्करण को भी संग्रहीत करना शुरू कर सकते हैं साझा संदर्भ, और जब यह आपके ऐप के वास्तविक संस्करण (ऊपर दिखाया गया है, इसे कैसे प्राप्त करें) से मेल नहीं खाता है, तो आप कुछ भी कर सकते हैं। –

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