问题的本质是关于序列化和持久化对象,然后再反序列化它们。有很多方法可以做到这一点,更强大和更复杂的解决方案通常涉及数据库,通常是 Android 上的 SQLite,以及一些对象关系映射框架。
但是,在这种情况下,这种强大的解决方案可能有点过头了,因为该用例用于序列化和保存非常小的对象列表,每个对象的字段数量有限。在 Android 上保存小块数据的最常用方法是在共享首选项中。您可以通过以下方式获得对管理这些对象的引用:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
一旦你有了这个,你就可以使用这样的代码将字符串保存到持久存储中:
SharedPreferences.Editor editor = preferences.edit();
editor.putString("savedBeacons", savedBeaconsAsString);
editor.apply();
然后像这样加载它们:
String savedBeaconsAsString = preferences.getString("savedBeacons", null);
当然,以上只是将单个字符串保存到持久存储中。如何将对象列表转换为字符串,以及如何将字符串转换为对象列表。这称为序列化。
有很多方法可以做到这一点,包括转换为 JSON 和从 JSON 转换。最简单的方法之一是使用 Java 序列化 API。这些的主要缺点是,如果您稍后在保存记录后更改 Java 代码中的对象定义,它们可能无法反序列化(加载回)您的对象。
这是一个将 savedBeacons 数组与 String 相互转换的示例,取自 this related answer。请注意,下面的代码假定 savedBeacons 是一个数组,而不是您的代码所示的 ArrayList。为简单起见,我将其显示为一个数组,因为 ArrayList 不可序列化。
// serialize
ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(savedBeacons);
String savedBeaconsAsString = new String(Hex.encodeHex(out.toByteArray()));
// deserialize
ByteArrayInputStream in = new ByteArrayInputStream(Hex.decodeHex(savedBeaconsAsString.toCharArray()));
savedBeacons = (BeaconDevice[]) new ObjectInputStream(in).readObject()));