在API级别8中将ArrayList
个字符串保存到SharedPreferences
的最佳方法是什么?我现在能想到的唯一方法是将所有字符串保存到一个用逗号分隔的字符串中并以这种方式保存。但我不知道字符串是否有最大大小。
有更好的方法吗?
答案 0 :(得分:25)
如果您可以保证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, ","));
您受设备内存的限制。使用后台线程来读/写共享首选项是一种很好的做法。
答案 1 :(得分:10)
我建议您将arraylist保存为Android中的内部存储文件。例如,对于名为 内部存储文件IO(写入): 内部存储文件IO(读取):text_lines
的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(); }
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 :(得分:3)
putStringSet()
中有一种方法SharedPreferences.Editor
,如果您的字符串为Set
,则可以利用该方法。 (也就是说,没有重复)。
答案 3 :(得分:3)
如果你正在使用api(比如8级)你不能使用put / getStringSet(),那么这是一个可能的解决方案,但这是非常昂贵和不灵活< / strong>如果你想存储更大的列表。我的意思是,如果性能很重要,那么为简单的类似数组的结构创建像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!