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?
- Predeterminado Preferencias compartidas me dan valores incorrectos en Service
- SharedPreferences Valor largo
- ListView y SharedPreferences de opción múltiple
- Android Almacenamiento interno VS Preferencias compartidas
- Actualizaciones de Android en Play Store
- ¿Cómo obtengo las preferencias para trabajar en Android?
- ¿Qué pasará con SharedPreferences al actualizar una aplicación de Android?
- ¿Por qué preferences.getString ("key", "DEFAULT") devuelve siempre "DEFAULT"?
- Cómo evitar que una preferencia compartida sea clara al establecer
- Cómo utilizar SharedPreferences en Android para almacenar, buscar y editar valores
- sharedPreferences no compartirá entre las actividades
- ArrayList <CustomClass> en SharedPreferences
- Cuál es la mejor manera de usar las preferencias compartidas entre las actividades
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 !
- Singletap touch detect en método Ontouch de la vista
- Android: SharedPreference: Los valores predeterminados no se establecen en el inicio