11

在 API 级别 8中保存ArrayList字符串的最佳方法是什么?SharedPreferences我现在能想到的唯一方法是将所有字符串保存到一个用逗号分隔的字符串中并以这种方式保存。但我不知道字符串是否有最大大小。

有一个更好的方法吗?

4

4 回答 4

26

如果你能保证你String的 s inArrayList不包含逗号,你可以简单地使用

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, ","));

您受到设备内存的限制。使用后台线程读取/写入共享首选项是一种很好的做法。

于 2012-08-27T23:40:16.187 回答
10

我建议您将数组列表保存为 Android 中的内部存储文件。例如,对于名为 的数组列表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();
于 2012-08-27T22:46:33.763 回答
3

有一个方法,putStringSet(), in SharedPreferences.Editor,如果你的字符串是Set. (也就是说,没有重复)。

于 2012-08-27T22:48:14.967 回答
3

如果您正在使用无法使用 put/getStringSet() 的 api(如级别 8),那么这是一个可能的解决方案,但如果您想存储更大的列表,这将非常昂贵且不灵活。我的意思是,如果性能很重要,那么为简单的类似数组的结构创建类似地图的数据结构会产生巨大的开销。

要保存它:

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

于 2012-08-27T23:07:32.983 回答