2012-01-29 14 views
10

मैं एक शब्दकोश ऐप विकसित कर रहा हूं। मेरे ऐप में, मुझे लगता है कि उपयोगकर्ता पसंदीदा शब्दों को सहेजना चाहता है। मैंने इन मानों को सहेजने के लिए साझा किए गए संदर्भ का उपयोग करने का निर्णय लिया है (मुझे पता है कि SQLite और फ़ाइलें बेहतर हैं लेकिन मैं "साझा किए गए संदर्भ" पर फंस गया हूं, इसलिए इसके साथ आगे बढ़ें)।एक से अधिक मानों को सहेजने के लिए SharedPreferences का उपयोग कैसे करें?

@Override 
public void onClick(View v) {          
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putString("favourite", mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     editor.commit();  
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

समस्या यह है कि यह एक से अधिक पसंदीदा शब्द को बनाए रखने नहीं करता है:

यहाँ नीचे मेरी कोड है। मेरा मतलब है कि केवल एक पसंदीदा शब्द बचाया जाता है और जब कोई नया जोड़ा जाता है, तो पिछला मिटा दिया जाता है।

तो, उपर्युक्त कोड कैसे संपादित किया जा सकता है ताकि यह समस्या हल हो जाए?

क्या आप लोग वहां मदद कर सकते हैं? आपका बहुत बहुत धन्यवाद।

उत्तर

17

आप एक ही स्ट्रिंग में कई पसंदीदा जोड़कर एक पसंदीदा वरीयता में बचा सकते हैं, प्रत्येक पसंदीदा आइटम कोमा द्वारा अलग किया जाता है। फिर आप स्ट्रिंग ऐरे में रूपांतरित करने के लिए convertStringToArray विधि का उपयोग कर सकते हैं। यहां पूर्ण स्रोत कोड है।
एकाधिक पसंदीदा आइटमों को सहेजने के लिए माईटालिटी विधियों का उपयोग करें।

  MyUtility.addFavoriteItem(this, "Sports"); 
      MyUtility.addFavoriteItem(this, "Entertainment"); 

सभी पसंदीदा की स्ट्रिंग सरणी बचाया

String[] favorites = MyUtility.getFavoriteList(this);// returns {"Sports","Entertainment"}; 

अलग उपयोगिता वर्ग

public abstract class MyUtility { 

    public static boolean addFavoriteItem(Activity activity,String favoriteItem){ 
     //Get previous favorite items 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     // Append new Favorite item 
     if(favoriteList!=null){ 
      favoriteList = favoriteList+","+favoriteItem; 
     }else{ 
      favoriteList = favoriteItem; 
     } 
     // Save in Shared Preferences 
     return putStringInPreferences(activity,favoriteList,"favorites"); 
    } 
    public static String[] getFavoriteList(Activity activity){ 
     String favoriteList = getStringFromPreferences(activity,null,"favorites"); 
     return convertStringToArray(favoriteList); 
    } 
    private static boolean putStringInPreferences(Activity activity,String nick,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, nick); 
     editor.commit();       
     return true;   
    } 
    private static String getStringFromPreferences(Activity activity,String defaultValue,String key){ 
     SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); 
     String temp = sharedPreferences.getString(key, defaultValue); 
     return temp;   
    } 

    private static String[] convertStringToArray(String str){ 
     String[] arr = str.split(","); 
     return arr; 
    } 
} 

में इन तरीकों को बचाने आप करना है, तो अतिरिक्त पसंदीदा जोड़ने मिलता है। फिर SharedPreference से पसंदीदा स्ट्रिंग प्राप्त करें और कॉमा + पसंदीदा आइटम संलग्न करें और इसे वापस SharedPreference में सहेजें।
* आप अल्पविराम के बजाय विभाजक के लिए किसी भी अन्य स्ट्रिंग का उपयोग कर सकते हैं।

+0

बहुत बहुत धन्यवाद। लेकिन मुझे अभी तक समझ में नहीं आता कि प्रोग्रामेटिक रूप से क्या करना है। यहां स्ट्रिंग फॉर्म साझा किया गया है साझािकरण: ' dict_name :: 149272 :: go,'। आपका कोड कहां रखा जाना चाहिए? –

+0

@ user998032 मैंने यह बताने के लिए कोड जोड़ा है कि हम कई पसंदीदा आइटम कैसे जोड़ सकते हैं। आप कोड का उपयोग इस तरह कर सकते हैं, यह आपके लिए काम करेगा। –

+0

@@ मुहम्मद नाबेल आरिफ: बहुत बहुत धन्यवाद, लेकिन अभी भी कोई भाग्य नहीं, क्षमा करें! मैं चाहता हूं कि पसंदीदा ऑनक्लिक के बाद सहेजा जाए लेकिन उपरोक्त संपादित कोड के बाद उत्पादित कई त्रुटियां। –

7

SharedPreferences सरल कुंजी/मान के माध्यम से काम करते हैं ताकि जब आप एक ही कुंजी के लिए एक नया मान प्रदान करते हैं, तो पिछला मान ओवरराइट हो जाता है। आप जो करने का प्रयास कर रहे हैं, वह करने का एकमात्र तरीका अलग-अलग चाबियों का उपयोग करना है, इस तथ्य की ओर इशारा करते हुए कि आप शायद SharedPreferences का उपयोग नहीं कर रहे हैं, जो आप करने की कोशिश कर रहे हैं।

5

हनीकोम्ब putStringSet विधि जोड़ा है, तो आप इस्तेमाल कर सकते हैं कि अगर आप कम कुछ भी समर्थन करने के लिए हनीकोम्ब से नहीं है:

@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    { 
     Set<String> faveSet = faves.getStringSet("favourite"); 
     faveSet.add(mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
     SharedPreferences.Editor editor = faves.edit(); 
     editor.putStringSet("favourite", faveSet); 
     editor.commit(); 
    } 
    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
} 

आप पूर्व-हनीकोम्ब उपकरणों के लिए समर्थन की जरूरत है, तो आप आना होगा अपनी योजना के साथ।

एक संभावना है कि शब्दों को अल्पविराम से अलग मूल्यों को एक वरीयता में स्टोर करना है।

दूसरा एक नया शब्द "favourite1", "favourite2", "favourite3" के लिए एक नई कुंजी उत्पन्न करना है और शब्दों की संख्या को संग्रहीत करने के लिए आप एक और वरीयता का उपयोग करते हैं।

+0

यह सच है, लेकिन दुर्भाग्य से मैं प्री-हनीकॉम डिवाइस के लिए चीजें कर रहा हूं। बहुत धन्यवाद। –

2

हर बार जब आप बटन पर क्लिक करते हैं तो आप पहले से मौजूद कुंजी के साथ पसंदीदा शब्द को सहेजते हैं: favorite और आप इसे ओवरराइड करते हैं। एक से अधिक शब्द को सहेजने के लिए आपको विभिन्न कुंजी के साथ शब्दों को सहेजना होगा। तो हर बार जब आप एक पसंदीदा शब्द तुम कर सकते हो बचाने:

private static int incrementedValue = 0; 
... 
@Override 
public void onClick(View v) { 
    SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    SharedPreferences.Editor editor = faves.edit(); 
    editor.putString("favourite" + incrementedValue, mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); 
    editor.commit(); 

    Log.i(CONTENT_TAG,"Favourite saved!"); 

    Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
    toast.show(); 
    incrementedValue++; 
} 
+0

बहुत बहुत धन्यवाद। मुझे आपका दृष्टिकोण पसंद है लेकिन जब इसे लागू किया जाता है, तो यह ** incrementedValue ** के साथ त्रुटियों का उत्पादन करता है, कहता है कि वेरिएबल डिक्लेरेशन आईडी की उम्मीद है ... –

+0

@ user998032 मैंने अपना जवाब संपादित किया, मैं incrementedValue चर की घोषणा के लिए 'int' जोड़ना भूल गया (विधि (क्लिक) पर विधि के साथ अपनी कक्षा में पहली पंक्ति, परिवर्तनीय घोषणा जोड़ने के लिए मत भूलना। – Luksprog

+0

बहुत बहुत धन्यवाद, स्लुकियन! यह काम करता है लेकिन जैसा कि मैंने उम्मीद की थी। SharePreferences अब तारों को सहेजता है: ' dict_name :: 157562 :: ढेर अप, <स्ट्रिंग नाम =" favourite3 "> dict_name :: 31377 :: घंटी, dict_name :: 349333 :: बताएं, <स्ट्रिंग नाम =" favourite1 "> dict_name :: 349333 :: बताएं, <स्ट्रिंग नाम =" favourite0 "> dict_name :: 11834 :: am,', लेकिन केवल पहला पसंदीदा शब्द ("favourite0") देखने के लिए लोड किया गया है। –

1

खैर कि क्योंकि वास्तविक वरीयता भंडारण स्ट्रिंग की एक सूची, बस एक ही एक नहीं है तो जब भी आप कहते हैं putString() आप पिछले मान ओवरराइट है। एक वरीयता स्ट्रिंग में एकाधिक ऑब्जेक्ट्स को स्टोर करने का एक अच्छा तरीका JSON का उपयोग करना है। बस मूल्य को क्रमबद्ध करें और फिर उन्हें लिखें। यह भी आपकी इच्छित जटिलता के किसी वस्तु में सीधे वापस परिवर्तित करने का लाभ है। यदि आप इस मार्ग पर जाने का फैसला करते हैं तो Jackson का उपयोग करने में देखें।

1

आप एक TreeMap (या अन्य प्रकार की सूची का उपयोग कर सकते हैं जो Serializable लागू करता है)। यहां बताया गया है कि मैंने हाल ही में पसंदीदा की सूची कैसे संभाली है। ट्रीमैप में, पसंदीदा एक वर्ग है जिसका मैं उपयोग करता हूं। आपके मामले में, आप बस TreeMap < इंटीजर, स्ट्रिंग> का उपयोग कर सकते हैं।

private static TreeMap<Integer, Favourite> favourites; 

... 
... 
... 

// load favourites 
FileInputStream fis=null; 
ObjectInputStream ois = null; 
try { 
    fis = context.openFileInput(context.getString(R.string.favourites_file)); 
    try { 
    ois = new ObjectInputStream(fis); 
    favourites = (TreeMap<Integer, Favourite>) ois.readObject(); 
    } catch (StreamCorruptedException e) { 
    } catch (IOException e) { 
    } catch (ClassNotFoundException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    try { 
    if (ois!=null){ 
     ois.close(); 
    } 
    } catch (IOException e) { 
    }  
} 

if (favourites==null){ 
    favourites = new TreeMap<Integer, Favourite>();  
} 

... 
... 
... 

// save favourites 
FileOutputStream fos=null; 
ObjectOutputStream oos=null; 
try { 
    fos = context.openFileOutput(context.getString(R.string.favourites_file), MODE_PRIVATE); 
    try { 
    oos = new ObjectOutputStream(fos); 
    oos.writeObject(favourites); 
    } catch (IOException e) { 
    } 
} catch (FileNotFoundException e) { 
} finally { 
    if (oos!=null){ 
    try { 
     oos.close(); 
    } catch (Exception e2) { 

    } 
    }  
} 

आप मूल्यों को अलग करने के लिए "::" चीज़ से भी बच सकते हैं।

आशा है कि मदद करता है ...

+0

बहुत बहुत धन्यवाद। मैंने पहले की तरह कोशिश की है लेकिन पसंदीदा सूचीबद्ध होने पर समस्या आई है। –

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