Сохранить arraylist Strings для общих настроек
Каков наилучший способ сохранить ArrayList
строк в SharedPreferences
в уровне API 8? Единственный способ, о котором я могу думать сейчас, - это сохранить все строки в одну строку, разделенные запятыми, и сохранить ее таким образом. Но я не знаю, есть ли максимальный размер для строк.
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Я предлагаю вам сохранить 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(); }
Interal storage File 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();
Ответ 2
Если вы можете гарантировать, что ваш String
в 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, ","));
Вы ограничены памятью устройства. Рекомендуется использовать фоновый поток для чтения/записи общих настроек.
Ответ 3
В SharedPreferences.Editor
есть метод putStringSet()
, который вы можете использовать, если ваши строки являются Set
. (То есть, нет дубликатов).
Ответ 4
Если вы используете 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!