将ArrayList<自定义对象>保存到本地存储

3

哦,天啊,我花了近一个小时的时间阅读和尝试不同的方法来存储 Android 偏好设置和本地存储中的 Parcelable ObjectArrayList,但现在我又回到了原点。顺便说一下,我已经下载并导入了 Gson,但我似乎无法让它工作。

基本上,我有一个名为 Task 的类,在一个名为 taskListArrayList<> 中,即使我的用户关闭了我的应用程序,我也需要保存它。该 Object 包含一个 String、一些 Ints、一些 Booleans 以及一个类为 SubtaskArrayList。重要的是,似乎我不能将其写成字符串列表,而我找到的所有教程都只显示了保存简单的 ArrayList,例如字符串,并且它们都是可序列化的,而不是 Parcelable。

编辑:谢谢你们的建议,但我实现 Parcelable 是为了在活动之间传递列表中的特定对象。


你想把它存储在哪里?在文件中还是SharedPreferences中?无论哪种方式,都可以看一下这个链接:https://dev59.com/tWw05IYBdhLWcg3wv0R6 - vkislicins
@vkislicins 我想将其保存在SharedPreferences中,因为这似乎更简单,但它看起来必须是可序列化的,而且无法保存所有我的值... - Oliver G Hjermitslev
Parcelable 显然不适用于持久存储。更好的选择是使用Serializable,或者实现自己的存储模式。 - JHH
上面的链接里的答案应该会对你有所帮助。 - vkislicins
我建议不要将大量数据保存到(共享)首选项中,因为正如名称所示,它们是偏好设置。我宁愿像通常情况下一样将它们存储到数据库或本地。 - JacksOnF1re
4个回答

2
根据Parcelable APIParcel API中的读取:
“Parcel不是一个通用的序列化机制。这个类(以及相应的Parcelable API,用于将任意对象放入Parcel中)被设计为高性能IPC传输。因此,将任何Parcel数据放入持久存储中都是不合适的:在Parcel中任何数据的底层实现发生变化时,旧数据可能无法读取。”
因此,如果您想通过ArrayList存储不同类型的所有引用,则必须将所有对象包装到一个公共接口中,在这种情况下Serializable是您的朋友。
另外,根据您的问题:
“我需要保存,即使我的用户关闭了我的应用程序。”
如果您查看 Android 生命周期,您会发现需要在 onStop() 中执行此操作,该方法会在您的活动不再对用户可见时被调用。

android lifecycle

您还可以参考此答案获取更多信息:创建一次性活动的共享首选项

1
我们可以使用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();     
    }
从 SharedPreference 获取 ArrayList 的代码。
   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);
}

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对象转换为字符串。
Gson gson = new Gson();
Employee m_employee = new Employee();
String str = gson.toJson(m_employee);
System.out.println("===== " + str);

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


你可能需要更详细地解释一下!! - Neeraj Jain
你使用哪个库? - ThrowsError

0
你可以尝试这个:
FileOutputStream fout = new FileOutputStream("c:\\object.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(yourObject);

更多信息,请参考此链接:这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接