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