Guardar un arraylist de cadenas a las preferencias compartidas

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

¿Hay una mejor manera de hacer esto?

Le sugiero que guarde el arraylist como archivo de almacenamiento interno en Android. Por ejemplo, para un arraylist llamado text_lines :

Almacenamiento interno Archivo 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 intermedio 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(); 

Si puedes garantizar que tu String s en ArrayList no contiene comas, simplemente puedes usar

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

Y para 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 del dispositivo. Es una buena práctica utilizar hilo de fondo para leer / escribir preferencias compartidas.

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

Si está usando una api (como el nivel 8) donde no puede usar put / getStringSet (), esta es una posible solución, pero esto es muy caro y no flexible si desea almacenar listas más grandes. Quiero decir, crear un mapa como datastructure para una simple matriz-como la estructura crea una enorme sobrecarga, si 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 para utilizarlo:

 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 utilizar SharedPreferences, considere el uso de SQLiteDatabase !

  • Las preferencias compartidas de Android no funcionan
  • Cuando Android SharedPreferences commit () devuelve false?
  • Android se niega a escribir / crear archivos de preferencias compartidas
  • ¿Puedo cambiar el nombre de archivo de Preferencias?
  • Cómo pasar el contexto de la aplicación dentro Singleton y SharedPreferences Clases
  • Android M extraño problema de preferencias compartidas
  • Cant valor de acceso de SharedPreference en diferentes subprocesos
  • Uso del editor de preferencias compartidas
  • onSharedPreferenceChanged no se disparó todo el tiempo
  • Preferencias compartidas vs base de datos
  • Android - ¿Cómo obtengo las preferencias compartidas de otra actividad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.