2012-08-27 15 views
10

एपीआई स्तर 8 में स्ट्रिंग्स के SharedPreferences को सहेजने का सबसे अच्छा तरीका क्या है? अब मैं सोच सकता हूं कि एकमात्र तरीका सभी तारों को अल्पविराम से अलग एक स्ट्रिंग में सहेजना है और इसे इस तरह से सहेजना है। लेकिन मुझे नहीं पता कि स्ट्रिंग के लिए अधिकतम आकार है या नहीं।साझा प्राथमिकताओं में स्ट्रिंग्स की एक सरणीसूची सहेजें

क्या ऐसा करने का कोई बेहतर तरीका है?

उत्तर

10

मैं आपको एंड्रॉइड में आंतरिक संग्रहण फ़ाइल के रूप में सरणी सूची को सहेजने का सुझाव देता हूं। एक ArrayList text_lines नामित के लिए उदाहरण के लिए:

आंतरिक भंडारण फ़ाइल आईओ (लेखन):

try { 
    //Modes: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE 
    FileOutputStream output = openFileOutput("lines.txt",MODE_WORLD_READABLE); 
    DataOutputStream dout = new DataOutputStream(output); 
    dout.writeInt(text_lines.size()); // Save line count 
    for(String line : text_lines) // Save lines 
     dout.writeUTF(line); 
    dout.flush(); // Flush stream ... 
    dout.close(); // ... and close. 
} 
catch (IOException exc) { exc.printStackTrace(); } 

interal भंडारण फ़ाइल आईओ (पढ़ना):

FileInputStream input = openFileInput("lines.txt"); // Open input stream 
DataInputStream din = new DataInputStream(input); 
int sz = din.readInt(); // Read line count 
for (int i=0;i<sz;i++) { // Read lines 
    String line = din.readUTF(); 
    text_lines.add(line); 
} 
din.close(); 
+0

धन्यवाद यह है कि मैं इसका उपयोग कर समाप्त हुआ, मुझे यकीन है कि अन्य उत्तर भी काम करेंगे – Peter

+1

अच्छा, आपके मामले में साझा किए गए लोगों के साथ चीजों को जटिल बनाने के बजाय यह आसान होगा। सौभाग्य! – Ali

+1

घटनाक्रम यह काम करेगा, साझा वरीयता में ऐप अनइंस्टॉलेशन तक जारी रखने की एक अनोखी संपत्ति है, लेकिन दूसरी तरफ यदि हम एसडी कार्ड स्टोरेज का उपयोग कर रहे हैं, तो हमें फ़ाइलों को स्पष्ट रूप से हटाना होगा। –

3

वहाँ एक विधि, putStringSet(), में है SharedPreferences.Editor, जिसका आप लाभ उठा सकते हैं यदि आपके तार Set हैं। (यानी, कोई डुप्लिकेट नहीं है)।

3

आप एक API उपयोग कर रहे हैं, जहां आप नहीं कर सकते उपयोग पुट/getStringSet(), तो यह एक संभव समाधान है, लेकिन इस बहुत महंगा और नहीं लचीला अगर आप बड़ा स्टोर करना चाहते है (8 स्तर की तरह) सूचियों। मेरा मतलब है कि एक सरल सरणी जैसी संरचना के लिए डेटास्ट्रक्चर जैसे नक्शा बनाना एक बड़ा ओवरहेड बनाता है, अगर प्रीफॉर्मेंस महत्वपूर्ण है।

यह सहेजने के लिए:

public static void writeList(Context context, List<String> list, String prefix) 
{ 
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = prefs.edit(); 

    int size = prefs.getInt(prefix+"_size", 0); 

    // clear the previous data if exists 
    for(int i=0; i<size; i++) 
     editor.remove(prefix+"_"+i); 

    // write the current list 
    for(int i=0; i<list.size(); i++) 
     editor.putString(prefix+"_"+i, list.get(i)); 

    editor.putInt(prefix+"_size", list.size()); 
    editor.commit(); 
} 

इसे पुनः प्राप्त करने के लिए:

public static List<String> readList (Context context, String prefix) 
{ 
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE); 

    int size = prefs.getInt(prefix+"_size", 0); 

    List<String> data = new ArrayList<String>(size); 
    for(int i=0; i<size; i++) 
     data.add(prefs.getString(prefix+"_"+i, null)); 

    return data; 
} 

और वास्तव में इसका इस्तेमाल करने की:

List<String> animals = new ArrayList<String>(); 
animals.add("cat"); 
animals.add("bear"); 
animals.add("dog"); 

writeList(someContext, animals, "animal"); 

और इसे पुनः प्राप्त करने:

List<String> animals = readList (someContext, "animal"); 

यदि आप साझा किए गए संदर्भों तक सीमित नहीं हैं, तो SQLiteDatabase का उपयोग करने पर विचार करें!

+1

अरे भाई मैं आपके कोड का उपयोग कर रहा हूं लेकिन इस कोड के कारण शून्य मानों को पुनर्प्राप्त कर रहा हूं: data.add (prefs.getString (उपसर्ग + "_" + i, null)); –

24

आप ArrayList में अपने String रों गारंटी ले सकते हैं, तो अल्पविराम शामिल नहीं है, तो आप बस

List<String> list = new ArrayList<String>(); 
... 
editor.putString(PREF_KEY_STRINGS, TextUtils.join(",", list)); 

उपयोग कर सकते हैं और इस सूची में

String serialized = prefs.getString(PREF_KEY_STRINGS, null); 
List<String> list = Arrays.asList(TextUtils.split(serialized, ",")); 

आप की स्मृति द्वारा सीमित हैं पढ़ने के लिए उपकरण। साझा प्राथमिकताओं को पढ़ने/लिखने के लिए पृष्ठभूमि धागे का उपयोग करना अच्छा अभ्यास है।

+0

अच्छा दृष्टिकोण, सरल। –

+0

धारावाहिक क्या करता है? –

+0

Arrays.asList को एक निश्चित आकार के ArrayList को न भूलें जो असमर्थित ऑपरेशन फेंक देगा यदि आप इसमें कुछ जोड़ने का प्रयास करते हैं। आप इसे नए ऐरेलिस्ट (Arrays.asList (TextUtils.split (serialized, ",")) जैसे बदल सकते हैं)। – Nikola

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