2012-08-27 14 views
10

Qual è il modo migliore per salvare un ArrayList di stringhe per SharedPreferences a livello di API 8? L'unico modo in cui posso pensare ora è quello di salvare tutte le stringhe in una stringa separata da virgole e salvarla in questo modo. Ma non so se c'è una dimensione massima per le stringhe.Salvare un ArrayList di stringhe di preferenze condivise

C'è un modo migliore per farlo?

risposta

10

suggerisco di salvare l'arraylist come File Storage interno in Android. Ad esempio per un ArrayList di nome text_lines:

File Memoria interna IO (scrittura):

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

stoccaggio Interal File 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

Grazie questo è ciò che ho finito per usare, sono sicuro che altre risposte avrebbe funzionato troppo – Peter

+1

Buono, sarebbe più facile, invece di rendere le cose complicate con sharedprefereces nel tuo caso. In bocca al lupo! – Ali

+1

Eventhough questo lavoro, la preferenza condivisa ha una proprietà peculiare del persistere fino alla disinstallazione applicazione, ma d'altra parte se stiamo utilizzando scheda di memoria SD, dovremo eliminare in modo esplicito i file. –

3

C'è un metodo, putStringSet(), in SharedPreferences.Editor, che puoi sfruttare se le tue stringhe sono Set. (Cioè, nessun duplicato).

3

Se si utilizza un'API (come il livello 8) dove si cant utilizzare put/getStringSet(), allora questa è una possibile soluzione, ma questo è molto costoso e non flessibili se si desidera memorizzare più grande elenchi. Voglio dire, creare una mappa come la struttura dei dati per una semplice struttura a forma di matrice crea un sovraccarico enorme, se la preformance è importante.

per salvarlo:

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

per recuperarlo:

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

e di utilizzare in realtà:

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

writeList(someContext, animals, "animal"); 

e di recuperarli:

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

Se non si è limitato ad utilizzare SharedPreferences, considerare l'utilizzo di SQLiteDatabase!

+1

hey brother sto usando il tuo codice ma recupero valori null a causa di questo codice: data.add (prefs.getString (prefisso + "_" + i, null)); –

24

Se si riesce a garantire i vostri String s in ArrayList non contengono virgola, si può semplicemente utilizzare

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

e leggere la lista

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

Si sono limitati dal ricordo di il dispositivo. È buona norma utilizzare il thread in background per leggere/scrivere le preferenze condivise.

+0

Un buon approccio, semplice. –

+0

Cosa fa serializzato? –

+0

Non dimenticare Arrays.asList fornisce un ArrayList di dimensioni fisse che getterà UnsupportedOperation se si tenta di aggiungere qualcosa ad esso. Puoi cambiarlo come nuovo ArrayList (Arrays.asList (TextUtils.split (serializzato, ","))). – Nikola

Problemi correlati