我有一个包含自定义对象的ArrayList
,每个自定义对象都包含各种字符串和数字。即使用户离开活动并希望在以后的某个时间回来,我也需要保留这个数组,但是在完全关闭应用程序后,我不需要该数组可用。我通过使用SharedPreferences
将许多其他对象保存在此方式中,但我无法弄清楚如何以此方式保存整个数组。这是可能的吗?也许SharedPreferences
不是解决此问题的方法?是否有更简单的方法?
我有一个包含自定义对象的ArrayList
,每个自定义对象都包含各种字符串和数字。即使用户离开活动并希望在以后的某个时间回来,我也需要保留这个数组,但是在完全关闭应用程序后,我不需要该数组可用。我通过使用SharedPreferences
将许多其他对象保存在此方式中,但我无法弄清楚如何以此方式保存整个数组。这是可能的吗?也许SharedPreferences
不是解决此问题的方法?是否有更简单的方法?
SharedPreferences Editor
接受Sets
。你可以将List转换为HashSet
或类似的东西,并以此方式存储它。当你读取回来时,将其转换为ArrayList
,如果需要,进行排序,然后就可以开始了。//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);
//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();
ArrayList
序列化,然后保存/读取到 SharedPreferences
中。以下是解决方案:
编辑:
好的,下面是将 ArrayList
保存为序列化对象到 SharedPreferences
然后从 SharedPreferences 中读取它的解决方案。addTask()
方法中,我们必须获取共享首选项的实例,然后使用 putString()
方法存储序列化后的 ArrayList:public void addTask(Task t) {
if (null == currentTasks) {
currentTasks = new ArrayList<task>();
}
currentTasks.add(t);
// save the task list to preference
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
Editor editor = prefs.edit();
try {
editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
} catch (IOException e) {
e.printStackTrace();
}
editor.commit();
}
同样地,我们需要在onCreate()
方法中从偏好设置中检索任务列表:
public void onCreate() {
super.onCreate();
if (null == currentTasks) {
currentTasks = new ArrayList<task>();
}
// load tasks from preference
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
try {
currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
您可以从Apache Pig项目的ObjectSerializer.java获取ObjectSerializer
类。
putStringSet
是在 API 11 中添加的。现今大部分程序员的目标至少是 API 8(Froyo)。 - CristianscoreEditor
是什么? - Ruchir Baronia使用这个对象 --> TinyDB--Android-Shared-Preferences-Turbo 很简单。
TinyDB tinydb = new TinyDB(context);
放置
tinydb.putList("MyUsers", mUsersArray);
获得
tinydb.getList("MyUsers");
更新
在这里可以找到一些有用的示例和故障排除:Android Shared Preference TinyDB putListObject frunction
getApplicationContext()
是指 new TinyDB(getApplicationContext());
- kc ochibili将Array
保存在SharedPreferences
中:
public static boolean saveArray()
{
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor mEdit1 = sp.edit();
/* sKey is an array */
mEdit1.putInt("Status_size", sKey.size());
for(int i=0;i<sKey.size();i++)
{
mEdit1.remove("Status_" + i);
mEdit1.putString("Status_" + i, sKey.get(i));
}
return mEdit1.commit();
}
从SharedPreferences
加载Array
数据
public static void loadArray(Context mContext)
{
SharedPreferences mSharedPreference1 = PreferenceManager.getDefaultSharedPreferences(mContext);
sKey.clear();
int size = mSharedPreference1.getInt("Status_size", 0);
for(int i=0;i<size;i++)
{
sKey.add(mSharedPreference1.getString("Status_" + i, null));
}
}
正如 @nirav 所说,最佳解决方案是使用 Gson 工具类将其作为 json 文本存储在 sharedPrefernces 中。以下是示例代码:
//Retrieve the values
Gson gson = new Gson();
String jsonText = Prefs.getString("key", null);
String[] text = gson.fromJson(jsonText, String[].class); //EDIT: gso to gson
//Set the values
Gson gson = new Gson();
List<String> textList = new ArrayList<String>(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();
您可以将其转换为 JSON字符串
并将该字符串存储在 SharedPreferences
中。
/**
* Save and get ArrayList in SharedPreference
*/
JAVA:
public void saveArrayList(ArrayList<String> list, String key){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply();
}
public ArrayList<String> getArrayList(String key){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
return gson.fromJson(json, type);
}
Kotlin.fun saveArrayList(list: java.util.ArrayList<String?>?, key: String?) {
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
val editor: Editor = prefs.edit()
val gson = Gson()
val json: String = gson.toJson(list)
editor.putString(key, json)
editor.apply()
}
fun getArrayList(key: String?): java.util.ArrayList<String?>? {
val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
val gson = Gson()
val json: String = prefs.getString(key, null)
val type: Type = object : TypeToken<java.util.ArrayList<String?>?>() {}.getType()
return gson.fromJson(json, type)
}
大家好,我已经找到了不使用 Gson
库解决上述问题的方法。在这里,我发布源代码。
1.变量声明即
SharedPreferences shared;
ArrayList<String> arrPackage;
2.变量初始化,即
shared = getSharedPreferences("App_settings", MODE_PRIVATE);
// add values for your ArrayList any where...
arrPackage = new ArrayList<>();
3.使用packagesharedPreferences()
将值存储到sharedPreference中:
private void packagesharedPreferences() {
SharedPreferences.Editor editor = shared.edit();
Set<String> set = new HashSet<String>();
set.addAll(arrPackage);
editor.putStringSet("DATE_LIST", set);
editor.apply();
Log.d("storesharedPreferences",""+set);
}
4. 使用retriveSharedValue()
获取sharedPreference的值:
private void retriveSharedValue() {
Set<String> set = shared.getStringSet("DATE_LIST", null);
arrPackage.addAll(set);
Log.d("retrivesharedPreferences",""+set);
}
希望这对你有所帮助...
Android SharedPreferances允许您将原始数据类型(布尔值,浮点数,整型,长整型,字符串和自API11起可用的StringSet)保存为XML文件。
任何解决方案的关键思想都是将数据转换为其中一种原始数据类型。
我个人喜欢将我的列表转换为JSON格式,然后将其作为SharedPreferences值保存为一个字符串。
为了使用我的解决方案,您需要添加Google的Gson库。
在gradle中只需添加以下依赖项(请使用Google的最新版本):
compile 'com.google.code.gson:gson:2.6.2'
保存数据(其中HttpParam是您的对象):
List<HttpParam> httpParamList = "**get your list**"
String httpParamJSONList = new Gson().toJson(httpParamList);
SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(**"your_prefes_key"**, httpParamJSONList);
editor.apply();
获取数据(其中HttpParam是您的对象):
SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
String httpParamJSONList = prefs.getString(**"your_prefes_key"**, "");
List<HttpParam> httpParamList =
new Gson().fromJson(httpParamJSONList, new TypeToken<List<HttpParam>>() {
}.getType());
这是您的完美解决方案.. 尝试一下吧,
public void saveArrayList(ArrayList<String> list, String key){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply(); // This line is IMPORTANT !!!
}
public ArrayList<String> getArrayList(String key){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
return gson.fromJson(json, type);
}
private String convertToString(ArrayList<String> list) {
StringBuilder sb = new StringBuilder();
String delim = "";
for (String s : list)
{
sb.append(delim);
sb.append(s);;
delim = ",";
}
return sb.toString();
}
private ArrayList<String> convertToArray(String string) {
ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(",")));
return list;
}
使用convertToString
方法将Arraylist转换为字符串后,您可以保存它,并使用convertToArray
方法检索字符串并将其转换为数组。
在API 11之后,您可以直接将set保存到SharedPreferences中!!! :)