【问题标题】:Android. Easy way to save small arrayList of custom objects安卓。保存自定义对象的小数组列表的简单方法
【发布时间】:2017-04-12 20:21:33
【问题描述】:

我在程序中有一个小列表,我想让用户保存它,而不是每次应用启动时都填写它。

名单:

public static ArrayList<BeaconDevice> SavedBeacons;

通常最多包含 5-10 个 BeaconDevice 对象。

BeaconDevice 是一个包含 Beacon 对象(来自 AltBeacon 库)和字符串格式名称的对象。

最好的方法是什么?

【问题讨论】:

  • 最好的方法是什么?见仁见智
  • 你觉得皮奥多怎么样?
  • 您必须存储整个对象,还是可以将蓝牙地址存储为字符串列表?
  • 我想存储整个对象。有人刚刚发布了一个对我有帮助的方法。

标签: java android arraylist altbeacon


【解决方案1】:

问题的本质是关于序列化和持久化对象,然后再反序列化它们。有很多方法可以做到这一点,更强大和更复杂的解决方案通常涉及数据库,通常是 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()));

【讨论】:

  • 我之前看到过这个答案,但是我在将我的 arrayList 转换为 String 时遇到了问题。我现在没有太多时间,所以我决定使用 Gson 方法使用另一个答案,效果很好。感谢您的回复。
【解决方案2】:

这类东西有一个库,解决起来很简单

compile 'com.google.code.gson:gson:2.4'

因此,通过导入它,您可以像这样直接保存/检索您的 arrylist ::

保存 ::

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Type listOfBecons = new TypeToken<List<BeaconDevice>>() {}.getType();

String strBecons = new Gson().toJson(SavedBeacons, listOfBecons);
preferences.edit().putString("BECON_LIST", strBecons).apply();

检索::

ArrayList<BeaconDevice> mSavedBeaconList = new Gson().fromJson(preferences.getString("BECON_LIST", ""), listOfBecons);

【讨论】:

    【解决方案3】:

    如果它是一个小列表,您可以使用 Gson 库将该列表转换为 JSON 字符串,并将其作为字符串保存在 SharedPreferences 中。请参阅这个答案https://stackoverflow.com/a/15011927/3090173,它基本上构成了相同的用例。

    【讨论】:

    • 这假定BeaconDevice 是可序列化的
    • @cricket_007 Gson 不需要对象来实现 Serializable。
    • 我所说的“能够被序列化”和 Java Serializable 接口是有区别的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多