2012-12-29 40 views
9

उदाहरण के लिए, यदि वरीयताओं की कुछ प्रविष्टियों को जोड़ा या हटा दिया गया है, तो ऐप को प्राथमिक वरीयता डेटा को कैसे प्रबंधित किया जाता है जब ऐप को नई वरीयता संरचना के साथ अपडेट किया जाता है?एंड्रॉइड उपयोगकर्ता वरीयताओं के मौजूदा डेटा का क्या होता है जब प्राथमिकता किसी नए संस्करण में बदलती है?

मुझे इस प्राथमिक प्रश्न के लिए खेद है, लेकिन मेरी मेहनती खोज और पढ़ने का जवाब नहीं मिला।

+0

आप prefs XML फ़ाइल को डीडीएमएस से खींच सकते हैं और यदि आप – mango

उत्तर

6

साझा प्राथमिकताओं को xml फ़ाइल में data/data/your.application.package/shared_prefs/ फ़ोल्डर में संग्रहीत किया जाता है। फ़ाइल को your.application.package_preferences.xml कहा जाता है;

जब आप साझा प्राथमिकताओं को पुनर्प्राप्त करते हैं, तो आप Context.getSharedPreferences विधि को कॉल करते हैं। यह SharedReferences ऑब्जेक्ट बनाता है और SharedReferences.startLoadFromDisk विधि को आमंत्रित करता है।

यदि आप इस विधि को खोलते हैं, तो आप देखेंगे कि प्राथमिकता वाले xml फ़ाइल (mFile) को पार्स किया गया है और वरीयताओं को मेमोरी स्टोरेज (map) में लोड किया गया है।

BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024); 
map = XmlUtils.readMapXml(str); 

तब से आप हमेशा स्मृति से अपनी प्राथमिकताओं को पढ़ेंगे। private Map<String, Object> mMap चर से बिल्कुल। इसके अलावा एप्लिकेशन startReloadIfChangedUnexpectedly विधि को कॉल कर सकता है और यदि अंतर्निहित फ़ाइल बदल दी गई है, तो इसे पार्स किया जाएगा और एक नया हैश मैप बनाया जाएगा।

अपने प्रश्न के रूप में, वहाँ निम्नलिखित मामलों हैं:

  1. आप एक नए संस्करण में एक प्राथमिकता आइटम जोड़ा। फिर दूसरे पैरामीटर के रूप में निर्दिष्ट डिफ़ॉल्ट मान वापस कर दिया जाएगा। नोट: विशेषता एंड्रॉइड: डिफ़ॉल्ट वैल्यू का उपयोग नहीं किया जाता है, इसलिए जागरूक रहें।

    String v = (String)mMap.get(key); // not found => v = null

    return v != null ? v : defValue; // return defValue

  2. आप एक नए संस्करण में एक प्राथमिकता आइटम निकाला। एक्सएमएल फ़ाइल और map ऑब्जेक्ट में कुछ अनावश्यक डेटा होगा, लेकिन जब उपयोगकर्ता अगली बार प्राथमिकताएं सहेजता है तो यह तय किया जाएगा।

  3. आपने किसी वरीयता आइटम की कुंजी को कुछ कुंजी में बदल दिया जिसका उपयोग नहीं किया गया था। फिर डिफ़ॉल्ट मान वापस कर दिया जाएगा। पी .1 के समान परिणाम।

  4. (उदाहरण के लिए कुंजी pref1_key साथ,) एक वरीयता आइटम निकाला और एक अन्य मद की कुंजी बदल इतना है कि यह पहला आइटम (pref2_key से pref1_key करने के लिए) को दर्शाता है। फिर दूसरी प्राथमिकता आइटम में पहले आइटम का मूल्य होगा।

  5. आपने एक प्रकार का वरीयता आइटम बदल दिया (उदाहरण के लिए बूलियन से int तक)। फिर यह इस और इसी तरह के कोड के कारण CastException फेंक देगा: (Integer)mMap.get(key);। लेकिन आप, उदाहरण के लिए, ListTextPreference को ListPreference में बदल सकते हैं, क्योंकि दोनों के पास स्ट्रिंग प्रकार है।

हो सकता है कि वहाँ कुछ और परीक्षण मामलों रहे हैं, लेकिन अब तक मैं केवल 5.

ऊपर कर दिया है इसके अलावा यहाँ उदाहरण है की वरीयताओं ListPreference, EditTextPreference और CheckBoxPreference साथ फाइल:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="pref_theme_key">THEME_LIGHT</string> 
    <string name="pref_homepage_key">test</string> 
    <boolean name="pref_display_name_key" value="true" /> 
</map> 
+0

चाहते हैं तो विस्तृत उत्तर के लिए धन्यवाद। आपके सूचीबद्ध मामले बिल्कुल मेरे दिमाग में थे। मैंने सोचा कि बदलती वरीयता संरचना ऐप विकास के दौरान काफी आम परिदृश्य थी, लेकिन एंड्रॉइड दस्तावेज़ में इसे संबोधित करने में कुछ भी नहीं मिला। शायद, मैं सही दस्तावेज़ को नहीं देख रहा था। – Hong

+2

@ हांग कभी-कभी आधिकारिक दस्तावेज में कोई जानकारी नहीं होती है, इसलिए मैं grepcode वेबसाइट का उपयोग करता हूं और स्रोत कोड की जांच करता हूं। – vorrtex

2

एंड्रॉइड मौजूदा वरीयता डेटा को कैसे संभालता है जब ऐप को नई वरीयता संरचना के साथ अपडेट किया जाता है?

यह स्पष्ट नहीं है कि "वरीयता संरचना" से आपका क्या मतलब है।

आप SharedPreferences को लगातार HashMap के रूप में सोच सकते हैं। आप विभिन्न चाबियों के तहत विभिन्न मूल्यों को स्टोर करते हैं, और आप उन्हें बाद में वापस ले सकते हैं। एंड्रॉइड के पास कोई प्राथमिकता कुंजी या उन मानों के प्रकारों के ज्ञान का ज्ञान नहीं है, जब तक आप वास्तव में कुछ स्टोर नहीं करते हैं।

मेरा अनुमान है कि "वरीयता संरचना" से, आपका मतलब है "एक्सएमएल में प्राथमिकता स्क्रीन परिभाषाएं"।

  • अगर आप नए वरीयताओं जोड़ने के लिए, एंड्रॉयड उन सामान्य रूप से बस के रूप में अगर वरीयताओं के आसपास किया गया है सब साथ लेकिन उपयोगकर्ता अगर आप को दूर से पहले

  • उन प्राथमिकताओं को सेट कभी नहीं किया था संभाल लेंगे,: उस मामले में प्राथमिकताएं जो आपने पहले उपयोग की थीं, पुराना डेटा तब तक बना रहता है जब तक कि आप इसे से छुटकारा पाने के लिए चुनते हैं, क्योंकि एंड्रॉइड के पास यह जानने का कोई तरीका नहीं है कि आप कभी भी उस डेटा का उपयोग कभी नहीं करेंगे

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

कोई है, अपने कोड स्मार्ट के डाल करने के लिए कहीं न कहीं कुंजी परिवर्तन को प्रतिबिंबित करने के लिए अपने SharedPreferences डेटा को अद्यतन करने की आवश्यकता होगी SharedPreferencesOpenHelper वरीयता "स्कीमा संस्करण" प्रबंधित करने के लिए SQLiteOpenHelper के बराबर और डेटा माइग्रेट करने में आपकी सहायता करें। यदि आप ऐसा करते हैं, तो आपको ऐसा सिस्टम बनाने के लिए आपका स्वागत है, अगर आपको लगता है कि यह आपको अक्सर-बदलती "वरीयता संरचना" प्रबंधित करने में मदद करेगा।