2012-08-27 8 views
10

Jaki jest najlepszy sposób zapisywania ciągów znaków na ArrayList na SharedPreferences na poziomie interfejsu API 8? Jedyny sposób, jaki mogę teraz wymyślić, to zapisanie wszystkich ciągów w jeden ciąg oddzielony przecinkami i zapisanie w ten sposób. Ale nie wiem, czy istnieje maksymalny rozmiar ciągów.Zapisywanie listy dostępnych ciągów znaków w udostępnionych preferencjach

Czy jest lepszy sposób to zrobić?

Odpowiedz

10

Proponuję zapisać listę jako plik pamięci wewnętrznej w systemie Android. Na przykład dla ArrayList o nazwie text_lines:

Pamięć wewnętrzna File IO (Writing):

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 przechowywanie plików IO (Reading):

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

Dzięki temu właśnie skończyłem używać, jestem pewien, że inne odpowiedzi też by działały. – Peter

+1

Dobrze, byłoby łatwiej, zamiast komplikować sprawy za pomocą sharedprefereces w twoim przypadku. Powodzenia! – Ali

+1

Mimo że to zadziała, preferencje udostępniania mają szczególną właściwość utrzymywania się do odinstalowania aplikacji, ale z drugiej strony, jeśli korzystamy z pamięci SD, będziemy musieli jawnie usunąć pliki. –

3

Istnieje metoda, putStringSet(), w SharedPreferences.Editor, z którego możesz skorzystać, jeśli twoje struny są Set. (To znaczy, nie ma duplikatów).

3

Jeśli używasz API (jak poziom 8), gdzie cant wykorzystanie put/getStringSet(), to jest to możliwe rozwiązanie, ale to bardzo drogie i nie elastyczny jeśli chcesz przechowywać większe listy. Chodzi o to, że tworzenie mapy, takiej jak struktura danych dla prostej struktury tablicowej, powoduje ogromne obciążenie, jeśli ważna jest jej wydajność.

Aby ją zapisać:

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

Aby pobrać go:

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

I rzeczywiście go używać:

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

writeList(someContext, animals, "animal"); 

i aby je odzyskać:

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

Jeśli nie ograniczają się do korzystania z SharedPreferences, należy rozważyć użycie SQLiteDatabase!

+1

Hej brat używam twojego kodu, ale pobierając wartości null z powodu tego kodu: data.add (prefs.getString (prefix + "_" + i, null)); –

24

Jeśli można zagwarantować swoje String sw ArrayList nie zawierają przecinek, można po prostu użyć

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

i do zapoznania się z listami

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

jesteś ograniczony przez pamięć urządzenie. Dobrą praktyką jest używanie wątku tła do odczytu/zapisu preferencji współdzielonych.

+0

Ładne podejście, proste. –

+0

Co robi serializacja? –

+0

Nie zapomnij Arrays.asList daje stałą ArrayList, która rzuci UnsupportedOperation, jeśli spróbujesz coś dodać. Możesz to zmienić jak nową ArrayList (Arrays.asList (TextUtils.split (serialized, ","))). – Nikola