将ArrayList <customclass>存储到SharedPreferences </customclass>中

时间:2014-12-15 11:45:43

标签: java android arraylist sharedpreferences

我有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();

8 个答案:

答案 0 :(得分:11)

将自定义对象的整个ArrayList存储为SharedPreferences

我们无法将ArrayList或任何其他Objects直接存储到SharedPrefrences

有相同的解决方法。我们可以使用GSON库。

Download From Here

使用此库,我们可以将对象转换为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:)*