gpt4 book ai didi

android - 如何在 Activity 重新启动时保留复杂对象?

转载 作者:IT老高 更新时间:2023-10-28 23:00:50 25 4
gpt4 key购买 nike

假设我有一个可序列化的 Java Bean 对象。我想在 Activity 故意通过 onDestroy() 时将其安全地存储起来(即 调用 onSaveInstanceState())。

我正在寻找一种不涉及创建数据库并将对象写入数据库的方法(主要是因为 a)Android 的 DB API 很糟糕,b)因为数据库使应用程序更新成为一场噩梦,因为没有像样的支持用于应用迁移)。

我考虑将对象序列化为 ByteArrayOutputStream,base64 对其进行编码并将其作为字符串写入 SharedPreferences 文件。还是离得太远了?

更新

也许序列化到字符串的想法毕竟不是那么糟糕,似乎效果很好。这是我现在正在做的事情:

    public static String objectToString(Serializable object) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
new ObjectOutputStream(out).writeObject(object);
byte[] data = out.toByteArray();
out.close();

out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out);
b64.write(data);
b64.close();
out.close();

return new String(out.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

public static Object stringToObject(String encodedObject) {
try {
return new ObjectInputStream(new Base64InputStream(
new ByteArrayInputStream(encodedObject.getBytes()))).readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

在 onDestroy() 中,我可以简单地将 Base64 字符串写入首选项文件,它是安全的,直到我在下一次 Activity 启动期间再次读取它。它比我预期的要快得多,除非你的 bean 携带大量数据,否则它工作得很好。更好的是,您不必维护数据库架构。

不过,我很好奇其他人是如何做到这一点的。

最佳答案

I am looking for a way which doesn't involve creating a database and write the object to that (mostly since a) Android's DB API is horrible and b) since databases make application updates a nightmare, because there is no decent support for applying migrations).

Android 的 API 实际上是相当合理的,主要是因为它是对 SQLite API 的精简包装,而 SQLite API 对于嵌入式数据库来说是相当合理的。此外,Android 确实通过 SQLiteOpenHelper 为应用升级的架构升级提供帮助。

It's a lot faster than I expected and unless your beans carry huge amounts of data, it works pretty well.

我听说过的开发人员因序列化而尖叫着逃跑的人数比我听说过的人在序列化方面取得长期成功的人数还要多。就在过去的几天里,在 SO #android 上,我与一个拼命想从他的应用程序中彻底删除序列化的人进行了交流。

And even better, you don't have to maintain a DB schema.

哦,是的。当你更新你的应用程序并修改你的类时,你认为会发生什么?做bookkeeping弄清楚如何从新版本的类中反序列化旧版本的类是一件苦差事,也是开发人员放弃序列化的原因之一。另外,不要忘记序列化不是事务性的,而 SQLite 是。

关于android - 如何在 Activity 重新启动时保留复杂对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1636623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com