将ArrayList <custom object =“”>保存到本地存储</custom>

时间:2015-04-15 11:09:33

标签: java android arraylist sharedpreferences gson

哦,小男孩,所以我花了大约一小时左右的时间阅读并尝试在Android偏好设置和本地存储中存储ArrayList Parcelable Object的不同方式,现在我&# 39;回到原点。顺便说一句,我已经下载并导入了Gson,而不是我可以让它工作。

基本上,我在名为Task的{​​{1}}中有一个名为ArrayList<>的班级,即使用户关闭我的应用,我也需要保存。如果重要的话,taskListObject,部分String,部分IntsBooleans等级ArrayList组成。重要的是,似乎我不能把它写成一个字符串列表,我发现的所有教程都只显示保存简单的ArrayLists,如Strings,它们都是Serializable,而不是Parcelable。

编辑:感谢您的建议,但是我将Parcelable实施为活动之间列表中的特定对象..

4 个答案:

答案 0 :(得分:2)

根据Parcelable API

Parcelable:可以在Parcel上写入和恢复实例的类的接口。

阅读Parcel API

  

Parcel不是通用序列化机制。此类(以及用于将任意对象放入Parcel的相应Parcelable API)被设计为高性能IPC传输。因此,将任何Parcel数据放入持久存储中是不合适的:Parcel中任何数据的底层实现的更改都可能导致旧数据不可读。

因此,如果要通过ArrayList存储不同类型的所有引用,则必须将所有对象包装到公共接口,在这种情况下Serializable是您的朋友。

另外,根据你的问题:

  

即使用户关闭我的应用,我也需要保存。

如果您检查Android生命周期,您将看到需要在onStop()中执行此操作,当您的活动不再对用户可见时,会调用此操作。

android lifecycle

来自this question

附加信息

在首选项中设置值:

// MY_PREFS_NAME - a static String variable like: 
//public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
 editor.putString("name", "Elena");
 editor.putInt("idName", 12);
 editor.commit();

从首选项中检索数据:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("text", null);
if (restoredText != null) {
  String name = prefs.getString("name", "No name defined");//"No name defined" is the default value.
  int idName = prefs.getInt("idName", 0); //0 is the default value.
}

更多信息:

Using Shared Preferences

Shared Preferences

答案 1 :(得分:0)

您可以将自定义对象转换为Json格式作为一个字符串并存储在SharedPreference中。

更新了

例如,您的自定义对象是Employee

public class Employee
{

    private String name = "test";
    private int age = 29;

    @Override
    public String toString()
    {
        return "Employee [age=" + age + ", name=" + name + "]";
    }
}

在Activity中,您可以将Java对象转换为String

Gson gson = new Gson();
Employee m_employee = new Employee();
String str = gson.toJson(m_employee);
System.out.println("===== " + str);

当用户关闭应用程序时,您可以在SharedPreference中存储 str 。当用户打开应用程序时从SharedPreference获取。

答案 2 :(得分:0)

你可以试试这个:

FileOutputStream fout = new FileOutputStream("c:\\object.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(yourObject);

有关详细信息,请参阅此链接: - Here

答案 3 :(得分:0)

我们可以保存自定义数组列表,并使用 SharedPreference

进行获取
  • 将数组列表值设置为SharedPreference
public void SaveArrayList(ArrayList<CustomObj> listArray){
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(listArray);
        editor.putString("TAG_LIST", json);  ///"TAG_LIST" is a key must same for getting data 
        editor.apply();     
    }

*要从SharedPrefrence获取数组列表

   public ArrayList<CustomObj> getArrayList(){
      SharedPreferences prefs = 
        PreferenceManager.getDefaultSharedPreferences(getContext());
            Gson gson = new Gson();
            String json = prefs.getString("TAG_LIST", null);
            Type listType = new TypeToken<ArrayList<CustomObj>>() {}.getType();
            mSomeArraylist= gson.fromJson(json, listType);
        return gson.fromJson(json, listType);
}