如何在首选项中保存对象(包括数组)?

时间:2013-06-14 23:51:21

标签: android android-preferences saving-data

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

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

然后加载它的值?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你可以用序列化来做。对象的序列化是可以序列化的对象的短唯一String格式。特别是几乎每个对象都可以在java中序列化,除了View对象。你的案子没有任何问题。

怎么做: 您应该使类ToDoList实现Serializable以及在您的对象中使用的所有类,即ProductStringboolean 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,并将在日志cat中打印详细消息。

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

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

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

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