2012-04-17 14 views
17

मैं SharedPreferences के मूल्यों को अद्यतन करने के कोशिश कर रहा हूँ, यहाँ मेरी कोड है:SharedPreferences मूल्य अपडेट नहीं किया जाता

edit = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
edit.putString(Settings.PREF_USERNAME+"",txtuser); 
edit.putString(Settings.PREF_PASSWORD+"",txtpass); 
edit.commit();" 

समस्या यह है कि जब मैं इस मूल्यों तक पहुँचने कर रहा हूँ, यह अद्यतन मूल्यों नहीं लौटा रहा है है, यह मुझे साझा संदर्भों का एक मूल्य देता है।

लेकिन जब मैं XML फ़ाइल में डेटा की पुष्टि कर रहा हूं, तो उसमें अपडेट किया गया डेटा।

और मेरे एप्लिकेशन को पुनरारंभ करने के बाद मुझे अपडेट किए गए मान मिल रहे हैं। तो मुझे अद्यतन मूल्य प्राप्त करने के लिए एप्लिकेशन को पुनरारंभ करने की आवश्यकता है।
तो, इन अद्यतन मानों को बदलने के बाद उन्हें कैसे प्राप्त करें?

अग्रिम

यहाँ धन्यवाद मेरे पूरे कोड है:

@Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     ctx=this; 

      status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value 
     submit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

        on(ctx,true);// function will call and value is updated 

       } 
      }});  

    status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value 

    } 
    public static boolean on(Context context) { 
     return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON); 
    } 

    public static void on(Context context,boolean on) { 
      if (on) Receiver.engine(context).isRegistered(); // 
     } 




**********in reciver file*********** 
public void isRegistered) { 
     Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit(); 
     edit.putString(Settings.PREF_STATUS+"","0"); 
     edit.commit(); 
} 
+1

मूल्य प्राप्त करने का कोड दिखाएं। –

+0

क्या आप अन्य कोड दिखा सकते हैं जो सही मान देता है। और कहां से आप मूल्य अपडेट कर रहे हैं? यदि साझा साझा प्राथमिकताओं को अपडेट करने से पहले आपको मूल्य मिल रहे हैं, तो यह निश्चित रूप से पुराने मान देगा। –

उत्तर

62

इसके बजाय edit.commit(); का उपयोग कर के, आप edit.apply(); उपयोग करना चाहिए। लागू करें प्राथमिकता ऑब्जेक्ट को तत्काल अपडेट करेगा और नए मान असीमित रूप से सहेज देगा, जिससे आपको नवीनतम मान पढ़ने की अनुमति मिल जाएगी।


प्रतिबद्ध()

कमिट अपनी प्राथमिकताएँ SharedPreferences को यह संपादक से वापस बदल जाता आपत्ति यह संपादन है। यह अनुरोधित संशोधनों को निष्पादित करता है, जो वर्तमान में साझा किए गए संदर्भों में बदल रहा है।

ध्यान दें कि जब दो संपादक एक ही समय में वरीयताओं को संशोधित कर रहे हैं, प्रतिबद्ध जीतने के लिए अंतिम व्यक्ति।

यदि आपको वापसी मूल्य की परवाह नहीं है और आप इसे से अपने एप्लिकेशन के मुख्य थ्रेड से उपयोग कर रहे हैं, तो इसके बजाय आवेदन() का उपयोग करने पर विचार करें।

लागू()

कमिट अपनी प्राथमिकताएँ SharedPreferences को यह संपादक से वापस बदल जाता आपत्ति यह संपादन है। यह अनुरोधित संशोधनों को निष्पादित करता है, जो वर्तमान में साझा किए गए संदर्भों में बदल रहा है।

नोट जब दो संपादकों एक ही समय में वरीयताओं को संशोधित कर रहे, पिछले एक जीत लागू कॉल करने के लिए कि।

प्रतिबद्ध() है, जो तुल्यकालिक लगातार भंडारण के लिए बाहर अपनी वरीयताओं को लिखते हैं, लागू() के विपरीत में स्मृति तुरंत SharedPreferences करने के लिए अपने परिवर्तन करता है, लेकिन शुरू होता है एक अतुल्यकालिक डिस्क के लिए प्रतिबद्ध हैं और आप की सूचना नहीं दी जाएगी कोई असफलता यदि इस SharedPreferences पर एक और संपादक एक नियमित रूप से प्रतिबद्ध है() जबकि अभी भी बकाया, एक लागू() के लिए प्रतिबद्ध() जब तक सभी async करता कर रहे हैं और साथ ही खुद को प्रतिबद्ध पूरा रोकेंगे। SharedPreferences उदाहरणों एकमात्र एक प्रक्रिया के भीतर हैं

रूप में, यह किसी भी() लागू होने वाले() यदि आप थे पहले से ही वापसी मान अनदेखी करने के कहने को बदलने के लिए सुरक्षित है।

आप Android घटक lifecycles और डिस्क के लिए() लेखन लागू के साथ अपने बातचीत के बारे में चिंता करने की जरूरत नहीं है। फ्रेमवर्क सुनिश्चित करता है कि इन-फ्लाइट डिस्क लागू होता है() राज्यों को स्विच करने से पहले पूर्ण हो जाता है।

+1

लागू होने पर() एक अच्छा विकल्प है, यह आपके मिनी एपीआई को 9 (2.3 जिंजरब्रेड) पर सेट करने का मुद्दा पेश करता है, जो मौजूदा आंकड़ों के मुताबिक, वहां सभी एंड्रॉइड डिवाइसों का लगभग 30% खटखटाता है।मैंने पाया कि अगली बार जब आप इसे चेक करते हैं तो प्रतिबद्ध() काम करता है, आप SharePreferences ऑब्जेक्ट का एक नया उदाहरण बना रहे हैं जो शायद एक कठिन कोड नहीं हो सकता है – Jag

+0

यदि लागू होता है() 'को अतुल्यकालिक रूप से कहा जाता है, तो मैं क्यों पढ़ूं यदि यह कोड नवीनतम मूल्य है? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 –

+0

@MaksimDmitriev "लागू() तुरंत इन-मेमोरी साझाकरण में परिवर्तन करता है लेकिन डिस्क पर एसिंक्रोनस प्रतिबद्धता शुरू करता है और आपको किसी भी विफलताओं के बारे में अधिसूचित नहीं किया जाएगा।" जब आप मूल्य डालते हैं और इसे लागू करने के तुरंत बाद साझा प्राथमिकताओं से पढ़ते हैं, तो यह आपको स्मृति से मूल्य बताता है, न कि भंडारण। – cuddlecheek

1

इस तरह की कोशिश करो,

public SharedPreferences prefs; 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser); 
editor.putString(Settings.PREF_PASSWORD+"", entered_name); 
editor.commit();  
1

आशा है कि यह तुम्हारी मदद करेगा ..

SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor prefsEditr = mypref.edit(); 
prefsEditr.putString("Userid", UserId); 
prefsEditr.commit(); 


String task1 = mypref.getString("Userid", ""); 
1

इस कोड का प्रयास करें:

SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor1 = edit.edit(); 
editor.putString(Settings.PREF_USERNAME + "", txtuser); 
editor.putString(Settings.PREF_PASSWORD + "", entered_name); 
editor.commit(); 
0

ठीक है, भले ही मेरा उत्तर प्रश्न के 3 साल बाद आया, मुझे आशा है कि इससे मदद मिलेगी। समस्या प्रतिबद्ध या लागू होने से नहीं बल्कि कोड संरचना से प्रतीत होती है।

के बारे में बताएं: किसी स्मार्ट फ़ोन पर, आप किसी ऐप को चलाने, लेकिन आप एपीपी छोड़ने नहीं है के रूप में हम कंप्यूटर पर करते हैं। इसका मतलब यह है कि जब आप स्मार्टफ़ोन के मेनू पर वापस आते हैं, तो एपीपी अभी भी "चल रहा है"। जब आप एपीपी आइकन पर फिर से "क्लिक" करते हैं, तो आप एपीपी को दोबारा नहीं चलाते हैं बल्कि इसे जागते हैं। जून कोड में, हम देख सकते हैं कि वह अपने बनाएँ फ़ंक्शन के अंदर getDefaultSharedPreferences को कॉल करता है।

तो वह getDefaultSharedPreferences जब उसने पहली बार एपीपी चलाता है कहता है। लेकिन जब वह पृष्ठभूमि पर एपीपी सेट करता है और फिर एपीपी जागता है, तो कॉल नहीं किया जाता है। यदि मैं अपने ऐप के लिए SharedPreference है मैं जाँच:

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

इसे कैसे हल करें? बस जोड़ें:

  @Override 
      public void onResume(){ 
      super.onResume(); 
     // And put the SharedPreferences test here 
      } 

इस कोड एपीपी की पहली बार चलाने पर बुलाया जाएगा, लेकिन यह भी हर बार उपयोगकर्ता जाग यह।

संबंधित मुद्दे