2012-08-27 12 views
10

¿Cuál es la mejor manera de guardar un ArrayList de cadenas en SharedPreferences en el nivel de API 8? La única forma en que puedo pensar ahora es guardar todas las cadenas en una cadena separada por comas y guardarlo de esa manera. Pero no sé si hay un tamaño máximo para cadenas.Guardar una lista de arrays de Cadenas para preferencias compartidas

¿Hay una mejor manera de hacerlo?

Respuesta

10

Le sugiero que guarde la lista de arrays como archivo de almacenamiento interno en Android. Por ejemplo para un ArrayList llamado text_lines:

del archivo de almacenamiento interno IO (escritura):

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

almacenamiento Interal archivo IO (Lectura):

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

Gracias, esto es lo que terminé usando, estoy seguro de que otras respuestas también funcionarían – Peter

+1

Bueno, sería más fácil en lugar de complicar las cosas con las preferencias compartidas en su caso. ¡Buena suerte! – Ali

+1

Aunque esto funcionará, las preferencias compartidas tienen una propiedad peculiar de persistir hasta la desinstalación de la aplicación, pero, por otro lado, si estamos usando el almacenamiento de la tarjeta SD, tendremos que eliminar explícitamente los archivos. –

3

Hay un método, putStringSet(), en SharedPreferences.Editor, que puede aprovechar si sus cadenas son Set. (Es decir, no hay duplicados).

3

Si está utilizando una API (al igual que el nivel 8) en el que no puede uso put/getStringSet(), entonces esta es una posible solución, pero esto es muy caro y no es flexible si desea almacenar más grande liza. Me refiero a crear un mapa como la estructura de datos para una estructura similar a una matriz simple que crea una gran sobrecarga, si la preformance es importante.

para guardarlo:

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

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

Y que realmente se utilicen:

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

writeList(someContext, animals, "animal"); 

Y para recuperarlo:

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

Si no está limitado a usar SharedPreferences, considere usar SQLiteDatabase!

+1

hey brother Estoy usando su código pero recuperando valores nulos debido a este código: data.add (prefs.getString (prefix + "_" + i, null)); –

24

Si se puede garantizar sus String s en ArrayList no contienen comas, puede simplemente usar

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

y leer la lista

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

Usted está limitado por la memoria de el dispositivo. Es una buena práctica usar hilo de fondo para leer/escribir preferencias compartidas.

+0

Buen enfoque, simple. –

+0

¿Qué hace serializada? –

+0

No olvide Arrays.asList proporciona ArrayList de tamaño fijo que lanzará UnsupportedOperation si intenta agregarle algo. Puede cambiarlo como la nueva ArrayList (Arrays.asList (TextUtils.split (serialized, ","))). – Nikola

Cuestiones relacionadas