2012-08-27 15 views
10

ArrayList dizeleri SharedPreferences API düzey 8'e kaydetmenin en iyi yolu nedir? Şimdi düşünebilmemin tek yolu, tüm dizeleri virgülle ayrılmış tek bir dizeye kaydetmek ve bu şekilde kaydetmek. Ama dizeler için maksimum boyut olup olmadığını bilmiyorum.Dizeleri bir arraylist paylaşılan tercihlerine kaydedin

Bunu yapmanın daha iyi bir yolu var mı?

cevap

10

Android'de arraylist'i Dahili Depolama Dosyası olarak kaydetmenizi öneriyorum. text_lines adında bir arraylist için Örnek:

Dahili depolama Dosya IO (Yazma):

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 depolama Dosya IO (Okuma):

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

Kullandığım şey budur, diğer cevapların da işe yarayacağına eminim. – Peter

+1

İyi, sizin durumunuzda paydaşlarla karmaşık şeyler yapmak yerine daha kolay olurdu. İyi şanslar! – Ali

+1

Bu işe yarayacak olsa da, paylaşılan tercih uygulama kaldırılıncaya kadar kalıcı bir özellik taşıyor, ancak diğer yandan SD kart depolama alanını kullanıyorsak, dosyaları açıkça silmemiz gerekecek. –

3

bir yöntem putStringSet() yılında vardır Dizeleriniz Set ise faydalanabileceğiniz SharedPreferences.Editor. (Yani, çoğaltma yok).

3

bir api kullanıyorsanız/getStringSet(), o zaman bu bir olası çözüm kullanımı koymak olduğunu cant, ama bu çok pahalı ve daha büyük depolamak istiyorsanız değildir esnek olduğu (seviyeye 8 gibi) listeleri. Preformans önemli ise, basit bir dizi benzeri bir yapı için veri yapısı gibi bir harita yaratmayı kastediyorum.

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; 
} 

Ve aslında kullanmak için:

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(); 
} 

geri almak için:

kaydetmek için

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

writeList(someContext, animals, "animal"); 

Ve geri almak için:

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

SharedPreferences'ı kullanmak için sınırlı değilseniz, SQLiteDatabase'u kullanmayı düşünün! Eğer virgül içermeyen ArrayList içinde String s garanti ederseniz, sadece

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

kullanabilir ve Sen anısına ile sınırlıdır

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

listesine okumak için

+1

Hey kardeşim kodunuzu kullanıyorum ama bu kod nedeniyle boş değerleri alma: data.add (prefs.getString (önek + "_" + i, null)); –

24

cihaz. Paylaşılan tercihleri ​​okumak/yazmak için arka plan iş parçacığı kullanmak iyi bir uygulamadır.

+0

Güzel yaklaşım, basit. –

+0

Serialize ne yapar? –

+0

Arrays.asList, bir şey eklemeye çalışırsanız, UnsupportedOperation'ı atacak sabit boyutlu bir ArrayList verir. Yeni ArrayList (Arrays.asList (TextUtils.split (serialized, ","))) gibi değiştirebilirsiniz. – Nikola