我有ArrayList
个自定义类Task
public class Task {
String name,desc;
Date date;
Context context;
public Task(String name, String desc, Date date, Context context) {
this.name = name;
this.desc = desc;
this.date = date;
this.context = context;
}
}
我想将它保存在SharedPreferences中..我读过可以通过将其转换为Set来完成..但我不知道该怎么做..
有办法做到这一点吗?或者任何其他存储数据的方式而不是SharedPreferences?
谢谢:)
编辑:
String s = prefs.getString("tasks", null);
if (tasks.size() == 0 && s != null) {
tasks = new Gson().fromJson(s, listOfObjects);
Toast.makeText(MainActivity.this, "Got Tasks: " + tasks, Toast.LENGTH_LONG)
.show();
}
protected void onPause() {
super.onPause();
Editor editPrefs = prefs.edit();
Gson gson = new Gson();
String s = null;
if(tasks.size() > 0) {
s = gson.toJson(tasks, Task.class);
Toast.makeText(MainActivity.this, "Tasks: " + s, Toast.LENGTH_LONG)
.show();
}
editPrefs.putString("tasks", s);
editPrefs.commit();
答案 0 :(得分:11)
我们无法将ArrayList
或任何其他Objects
直接存储到SharedPrefrences
。
有相同的解决方法。我们可以使用GSON
库。
使用此库,我们可以将对象转换为JSON String
,然后将其存储在SharedPrefrences
中,然后再检索JSON字符串并将其转换回Object。
但是,如果您要保存自定义类的ArrayList
,则必须执行以下操作,
定义类型
Type listOfObjects = new TypeToken<List<CUSTOM_CLASS>>(){}.getType();
然后将其转换为字符串并保存到共享首选项
String strObject = gson.toJson(list, listOfObjects); // Here list is your List<CUSTOM_CLASS> object
SharedPreferences myPrefs = getSharedPreferences(YOUR_PREFS_NAME, Context.MODE_PRIVATE);
Editor prefsEditor = myPrefs.edit();
prefsEditor.putString("MyList", strObject);
prefsEditor.commit();
检索字符串并将其转换回对象
String json = myPrefs.getString("MyList", "");
List<CUSTOM_CLASS> list2 = gson.fromJson(json, listOfObjects);
答案 1 :(得分:2)
您还可以将数组存储为全局应用程序值。
您必须使用arraylist创建一个类,如下所示:
public class MyApplication extends Application {
private ArrayList<Task> someVariable;
public ArrayList<Task> getSomeVariable() {
return someVariable;
}
public void setSomeVariable(ArrayList<Task> someVariable) {
this.someVariable = someVariable;
}
}
并且您必须在清单文件中声明此类,如下所示:
<application android:name="MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
要设置并获取阵列,您需要使用:
((MyApplication) this.getApplication()).setSomeVariable(tasks);
tasks = ((MyApplication) this.getApplication()).getSomeVariable();
以上关于共享偏好的建议也应该有效。
希望这有帮助。
答案 2 :(得分:1)
如果订单无关紧要,您可以使用
ArrayList arrayList = new ArrayList();
...
Set set = new HashSet(arrayList);
将您的列表转换为一组。然后可以将集保存在SharedPreferences中。
编辑:好的,似乎只适用于字符串列表。
答案 3 :(得分:1)
您无法保存Context
对象,保存它没有意义。我的建议是覆盖toString
以返回一个JSONObject,其中包含您要存储在SharedPreference中的信息。
public String toString() {
JSONObject obj = new JSONObject();
try {
obj.put("name", name);
obj.put("desc", desc);
obj.put("date", date.getTime());
catch (JSONException e) {
Log.e(getClass().getSimpleName(), e.toString());
}
return obj.toString();
}
并在SharedPreference中编写此json对象。当您阅读它时,您必须解析并构建您的Task
对象
答案 4 :(得分:0)
SharedPreferences支持一组字符串但不能解决您的问题。 如果需要存储自定义对象,可以将它们序列化为字符串并再次反序列化。 但这不适用于你的上下文变量 - 我不会存储它,因为它是设计临时的。 您还可以做的是让您的类实现可序列化,将其写入文件,然后将该文件的路径存储在您的首选项中。
答案 5 :(得分:0)
使用ObjectMapper可以做到。请看下面的代码。
public List<CustomClass> getCustomClass() {
List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
ObjectMapper objectMapper = new ObjectMapper();
String value = getString(CUSTOM_CLASS, null);
if (null != value) {
try {
mapList = objectMapper.readValue(value, List.class);
} catch (IOException e) {
e.printStackTrace();
}
}
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("cutoms", mapList);
return dataMap
}
您需要解析dataMap并获取值和
public void setCutomClass(List<CustomClass> cutoms) {
ObjectMapper objectMapper = new ObjectMapper();
String value = null;
try {
value = objectMapper.writeValueAsString(cutoms);
} catch (IOException e) {
e.printStackTrace();
}
setString(CUSTOM_CLASS, value);
}
希望上面的代码可以帮到你!!!
答案 6 :(得分:0)
您应该能够使用putParcelableArrayList()传递它。 should work
答案 7 :(得分:0)
**To save Arraylist values to SharedPreferences**
*Beneath code for Store values.*
SharedPreferences SelectedId = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = SelectedId.edit();
editor.putString("DeviceToken", TextUtils.join(",", limits)); // Add Array list elements to shared preferences
editor.commit();
Toast.makeText(getApplicationContext(), "Dash_Agil" + t, Toast.LENGTH_SHORT).show();
**To Retrieve**
SharedPreferences tt = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
String ss = tt.getString("DeviceToken", "");
List<String> list1 = new LinkedList (Arrays.asList(TextUtils.split(ss, ",")));
Toast.makeText(getApplicationContext(),""+list1, Toast.LENGTH_SHORT).show();
TextView t = (TextView) findViewById(R.id.list_items_id);
t.setText(ss);
*Hope this will help u:)*