2012-08-10 9 views
26

मैं सहायक विधि बनाने की कोशिश कर रहा हूं जो ऑब्जेक्ट्स के माध्यम से generic तरीके से पुन: प्रयास करेगा।सभी बंडल ऑब्जेक्ट्स के माध्यम से कैसे घुमाएं

तक "सामान्य" मेरा मतलब है:

  1. बंडल में वस्तुओं के नाम (कुंजी) पता करने के लिए एक पैरामीटर के रूप में पारित जरूरत नहीं है।
  2. यदि भविष्य में बंडल में कोई अन्य सदस्य (कुंजी) जोड़ा गया तो उसे बदलने की आवश्यकता नहीं है।

अब तक, मैं निम्नलिखित रूपरेखा कि पूरा करने के लिए यह पता लगाने:

private void bundleToSharedPreferences(Bundle bundle) { 
    Set<String> keys = bundle.keySet(); 
    for (String key : keys) { 
     Object o = bundle.get(key); 
     if (o.getClass().getName().contentEquals("int")) { 
      // save ints 
     } 
     else if (o.getClass().getName().contentEquals("boolean")) { 
      // save booleans 
     } 
     else if (o.getClass().getName().contentEquals("String")) { 
      // save Strings 
     } 
     else { 
      // etc. 
     } 
    } 
    } 

इस दृष्टिकोण बिल्कुल मतलब है?

क्या इसे पूरा करने का एक बेहतर तरीका है?

+2

मुझे नहीं लगता कि यह डिज़ाइन कोई समझ में आता है।आपकी प्राथमिकताओं और बंडल में जो कुछ आता है, वह हमेशा बंडल में नहीं जाना चाहिए क्योंकि आपके पास विशिष्ट कुंजी हैं जिन्हें वरीयता में मैप करने की आवश्यकता है। ये कुंजी के माध्यम से पहचाने जाते हैं, जिन्हें आपको हार्डकोड किया जाना चाहिए। – JoxTraex

+0

मुझे लगता है कि आप सही हैं। लेकिन क्या बंडल को (स्थानीय) लगातार भंडारण में सहेजने के लिए कोई ** सैने ** तरीका है? – ateiob

+0

SQLite डेटाबेस का उपयोग करने का प्रयास कर रहा है। – JoxTraex

उत्तर

3

मैं इसे प्रतिबिंब के माध्यम से करूँगा, अगर मैं इसे बिल्कुल करना चाहता था। एक स्थिर मानचित्र को संग्रहीत करें जैसे String.class नक्शे को SharePreference.putString() इत्यादि। फिर, जब आप आइटम के माध्यम से लूपिंग करते हैं तो मानचित्र के विरुद्ध अपनी कक्षा की जांच करें। यदि यह अस्तित्व में नहीं है, तो सुपरक्लास, आदि देखें। इससे आपको कॉल करने के लिए उचित विधि मिल जाएगी या आपको यह बताना होगा कि अनुरोधित ऑब्जेक्ट का प्रकार कुछ ऐसा नहीं है जिसे वरीयताओं में रखा जा सके।

तो बुनियादी एल्गोरिथ्म है:

  1. बंडल
  2. से वस्तु प्राप्त करें अपने वर्ग
  3. देखने के लिए कि वर्ग नक्शा
  4. अगर ऐसा है में है जाओ, निर्दिष्ट विधि आह्वान इसे साझा किए गए संदर्भों में रखने के लिए
  5. यदि यह नहीं है, तो यह सुपरक्लास प्राप्त करें और चरण 3 पर वापस आएं।
  6. यदि आप java.lang.Obj तक पहुंच जाते हैं ect तो आपके पास एक बंडल ऑब्जेक्ट है जिसे तुरंत साझा किए गए संदर्भों में संग्रहीत नहीं किया जा सकता है। जिस तरह से आप इसे नियंत्रित करने की कोशिश करना चाहते हैं, उस पर निर्भर करता है कि आप किस वर्ग को हिट कर चुके हैं या आप केवल त्रुटि रिकॉर्ड करना चाहते हैं और आगे बढ़ना चाहते हैं। जानने के बिना आप ऐसा क्यों कर रहे हैं, यह अनुमान लगाना असंभव है कि विधि विफल होने पर आपको प्रतिक्रिया कैसे देनी चाहिए। यह अनिवार्य रूप से तब तक होगा जब तक कि आप दोनों बंडल और वरीयताओं पर पूर्ण नियंत्रण प्राप्त नहीं कर लेते हैं, लेकिन यदि आपके पास उस नियंत्रण की मात्रा है तो इन सभी हुप्स के माध्यम से कूदने की कोई आवश्यकता नहीं है क्योंकि आप अधिक सरल हो सकते हैं और बस अपना खुद का परिभाषित कर सकते हैं चांबियाँ।

नोट: प्रतिबिंब तेजी से नहीं है और यह कोड और बनाए रखने की सबसे आसान बात नहीं है। यदि संभव हो तो मैं एक कम जेनेरिक विधि खोजने की सलाह दूंगा जो आपके उपयोग के मामले में फिट बैठता है।

+1

मैं इसे "* ** ** ** ** सभी बंडल ऑब्जेक्ट्स के माध्यम से iIterate के रूप में व्याख्या करता हूं! *"। स्वीकार करना क्योंकि किसी और ने एक बेहतर उत्तर प्रदान नहीं किया है। – ateiob

52

क्या आप toString() विधि का उपयोग कर स्ट्रिंग के रूप में सबकुछ बचा सकते हैं? पता नहीं है कि आदिम प्रकारों को उनके ऑब्जेक्ट समकक्षों (जैसे कक्षा से इंटीजर) में मैप किया गया है, लेकिन यदि वे हैं, तो आप प्रत्येक संभव वर्ग की श्रमिक रूप से जांच करने के बजाय ऐसा कुछ करने में सक्षम हो सकते हैं।

for (String key : bundle.keySet()) { 
     saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement 
} 

सुनिश्चित नहीं हैं कि अगर यह आपकी आवश्यकताओं के लिए काम करेंगे, लेकिन मैं JSON स्ट्रिंग में अभी एक बंडल कन्वर्ट करने के लिए इसी तरह की कुछ करने की कोशिश कर रहा हूँ।

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