如何在首选项中保存对象,如下所示:
public class ToDoList {
public String name;
public String date;
public ArrayList<Product> products = new ArrayList<Product>();
public boolean isChecked;
}
然后加载它的值?
答案 0 :(得分:0)
首选项是简单的键值对。在你的情况下,最好使用SQLite。
答案 1 :(得分:0)
你可以用序列化来做。对象的序列化是可以序列化的对象的短唯一String
格式。特别是几乎每个对象都可以在java中序列化,除了View
对象。你的案子没有任何问题。
怎么做:
您应该使类ToDoList
实现Serializable
以及在您的对象中使用的所有类,即Product
。 String
,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
,并将在日志cat中打印详细消息。
然后只需将todolistSer
保存为首选项中的String
,然后像这样回收您的对象:
ToDoList todolistObj = (ToDoList) ObjectSerializeDeserialize.ObjectDeserialization(todolistString);
禁止上述方法发出的任何警告,您就完成了!
P.S。只要有复杂的结构无法保存为原始变量并且您仍然不想使用数据库,就可以使用上述解决方案