Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将字符串的arraylist保存到共享首选项_Android_Arraylist_Sharedpreferences - Fatal编程技术网

Android 将字符串的arraylist保存到共享首选项

Android 将字符串的arraylist保存到共享首选项,android,arraylist,sharedpreferences,Android,Arraylist,Sharedpreferences,将字符串的ArrayList保存到API级别8中的SharedReferences的最佳方法是什么?我现在能想到的唯一方法是将所有字符串保存为一个字符串,用逗号分隔,并以这种方式保存。但我不知道字符串是否有最大大小 有更好的方法吗?我建议您将arraylist保存为Android中的内部存储文件。例如,对于名为text\u line的数组列表: 内部存储文件IO(写入): 内部存储文件IO(读取): FileInputStream-input=openFileInput(“lines.txt”)

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


有更好的方法吗?

我建议您将arraylist保存为Android中的内部存储文件。例如,对于名为
text\u line
的数组列表:

内部存储文件IO(写入):

内部存储文件IO(读取):

FileInputStream-input=openFileInput(“lines.txt”);//开放输入流
DataInputStream din=新的DataInputStream(输入);
int sz=din.readInt();//读取行计数

对于(int i=0;i在
SharedReferences.Editor
中有一个方法,
putStringSet()
,如果字符串是
集(即没有重复项),则可以利用该方法。

如果您使用的是无法使用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();
}
publicstaticvoidwritelist(上下文、列表、字符串前缀)
{
SharedReferences prefs=context.getSharedReferences(“YourApp”,context.MODE\u PRIVATE);
SharedReferences.Editor=prefs.edit();
int size=prefs.getInt(前缀+“_size”,0);
//清除以前的数据(如果存在)

对于(int i=0;i如果可以保证
ArrayList
中的
String
s不包含逗号,则可以使用

List<String> list = new ArrayList<String>();
...
editor.putString(PREF_KEY_STRINGS, TextUtils.join(",", list));
List List=new ArrayList();
...
putString(PREF_KEY_STRINGS,TextUtils.join(“,”,list));
和阅读列表

String serialized = prefs.getString(PREF_KEY_STRINGS, null);
List<String> list = Arrays.asList(TextUtils.split(serialized, ","));
String serialized=prefs.getString(PREF\u KEY\u STRINGS,null);
List List=Arrays.asList(TextUtils.split(序列化,“,”);

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

谢谢这是我最终使用的,我相信其他答案会很好用,在您的情况下,这会更容易,而不会使共享首选项变得复杂。祝您好运!即使这样做有效,共享首选项也会更简单rence有一个独特的特性,它可以一直保存到应用程序卸载,但另一方面,如果我们使用SD卡存储,我们将不得不显式删除这些文件。完全同意@SreekanthKarumanaghat,与
文件
相比,使用
共享优先级
更可取。@eRaisedToX请投票赞成t如果您同意,这个答案实际上是有目的的,但实际上并没有回答原来的问题。方法很好,很简单。序列化的作用是什么?别忘了Arrays.asList提供了一个固定大小的ArrayList,如果您尝试添加一些内容,它将抛出不支持操作。您可以像new ArrayList(Arrays.asList)一样更改它(TextUtils.split(序列化,“,”))。嘿,兄弟,我正在使用您的代码,但由于以下代码而检索空值:data.add(prefs.getString(前缀+“,”+i,null));
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");
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, ","));