Сохранить арриалист строк для общих настроек

Каков наилучший способ сохранить ArrayList строк в SharedPreferences в API 8? Единственный способ, о котором я могу думать сейчас, – сохранить все строки в одну строку, разделенные запятыми, и сохранить ее таким образом. Но я не знаю, есть ли максимальный размер для строк.

Есть лучший способ сделать это?

Solutions Collecting From Web of "Сохранить арриалист строк для общих настроек"

Я предлагаю вам сохранить arraylist как внутренний файл хранилища в Android. Например, для arraylist с именем text_lines :

Внутреннее хранилище Файл IO (запись):

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

Интерактивное хранилище Файл IO (чтение):

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

Если вы можете гарантировать, что String s в ArrayList не содержит запятую, вы можете просто использовать

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

И прочитать список

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

Вы ограничены памятью устройства. Рекомендуется использовать фоновый поток для чтения / записи общих настроек.

В putStringSet() есть метод putStringSet() , который вы можете использовать, если ваши строки являются Set . (То есть, нет дубликатов).

Если вы используете api (например, уровень 8), где вы не можете использовать put / getStringSet (), то это возможное решение, но это очень дорого и не является гибким, если вы хотите хранить более крупные списки. Я имею в виду создание такой карты, как datastructure для простой структуры, подобной массиву, которая создает огромные накладные расходы, если важна предварительная работа.

Чтобы сохранить его:

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

Чтобы получить его:

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

И фактически использовать его:

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

И получить его:

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

Если вы не ограничены использованием SharedPreferences, рассмотрите возможность использования SQLiteDatabase !