【问题标题】:Save an arraylist of Strings to shared preferences将字符串数组列表保存到共享首选项
【发布时间】:2012-08-22 10:47:33
【问题描述】:

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

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: android arraylist sharedpreferences


    【解决方案1】:

    如果你能保证ArrayList中的Strings不包含逗号,你可以简单地使用

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

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

    【讨论】:

    • 不错的方法,简单。
    • 序列化是做什么的?
    • 不要忘记 Arrays.asList 提供了一个固定大小的 ArrayList,如果您尝试向其中添加内容,它将抛出 UnsupportedOperation。您可以像 new ArrayList(Arrays.asList(TextUtils.split(serialized, ","))) 一样更改它。
    【解决方案2】:

    如果您正在使用无法使用 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

    【讨论】:

    • 嘿兄弟,我正在使用您的代码,但由于此代码而检索空值:data.add(prefs.getString(prefix+"_"+i, null));
    【解决方案3】:

    SharedPreferences.Editor 中有一个方法putStringSet(),如果您的字符串是Set,您可以利用该方法。 (也就是说,没有重复)。

    【讨论】:

      【解决方案4】:

      我建议您将数组列表保存为 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();
      

      【讨论】:

      • 谢谢这是我最终使用的,我相信其他答案也会起作用
      • 很好,在您的情况下,使用 sharedprefereces 会更容易,而不是使事情变得复杂。祝你好运!
      • 尽管这会起作用,但共享偏好有一个特殊的属性,即在应用程序卸载之前一直存在,但另一方面,如果我们使用 SD 卡存储,我们将不得不明确删除文件。跨度>
      • 完全同意@SreekanthKarumanaghat ,与files 相比,使用shared pref 更可取。
      • @eRaisedToX 如果您同意,请对评论进行投票,这个答案实际上虽然服务于目的,但实际上并没有回答原始问题。
      猜你喜欢
      • 2017-07-02
      • 2017-04-26
      • 2022-01-15
      • 1970-01-01
      • 2018-08-09
      • 2021-06-24
      • 2019-12-17
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多