1

如何在首选项中保存对象,如下所示:

public class ToDoList {
public String name;
public String date;
public ArrayList<Product> products = new ArrayList<Product>();
public boolean isChecked;
}

然后加载它的值?

4

2 回答 2

0

首选项是简单的键值对。在您的情况下,最好使用 SQLite。

于 2013-06-15T00:03:55.410 回答
0

你可以通过序列化来做到这一点。对象的序列化是可以序列化的对象的简短唯一String格式。特别是几乎每个对象都可以在java中序列化,除了来自View对象。你的情况不会有任何问题。

怎么做:你应该让类ToDoList实现Serializable和在你的对象中使用的所有类,例如ProductString,boolean ArrayList是可序列化的,因此您无需执行任何操作。在对象中实现序列化时,您必须提供一个序列版本 UID,然后将其用于序列化。

所以 ToDoList 会是这样的:

public class ToDoList implelements Serializable {
    private static final long serialVersionUID = //generate random by eclipse
    .....
    public ArrayList<Product> products = new ArrayList<Product>();
}

和产品:

public class Product implelements Serializable {
    private static final long serialVersionUID = //generate random by eclipse
    .....
}

然后包括这个静态助手类:

public class ObjectSerializeDeserialize {

public static String ObjectSerialization(Object obj)
{
    ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
    try
    {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArray);
        objectOutputStream.writeObject(obj);
        objectOutputStream.close();
    }
    catch (Exception e) {
        e.printStackTrace();
        return "";
    }
    return new String(Base64.encode(byteArray.toByteArray(), 0));
}

public static Object ObjectDeserialization(String str)
{
    byte[] byteArray = Base64.decode(str,0);
    Object o;
    try
    {
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArray));
        o = ois.readObject();
        ois.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
        return null;
    }
    return o;
}

}

只需使用以下代码:

 String todolistSer = ObjectSerializeDeserialize.ObjectSerialization(todolistObj);

如果出现问题,上面的代码行将返回一个空String,并将在 log cat 中打印详细消息。

然后只需将 保存todolistSer为首String选项并像这样回收您的对象:

 ToDoList todolistObj = (ToDoList) ObjectSerializeDeserialize.ObjectDeserialization(todolistString);

抑制上述方法发出的任何警告,您就完成了!

PS,只要您有无法保存为原始变量的复杂结构并且您仍然不想使用数据库,您就可以使用上述解决方案

于 2013-06-15T00:19:21.587 回答