Android系统。保存自定义对象的小arrayList的简便方法

时间:2016-11-29 00:10:43

标签: java android arraylist altbeacon

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

清单:

public static ArrayList<BeaconDevice> SavedBeacons;

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

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

最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

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

当然,上面只是将一个String保存到持久存储中。如何将对象列表转换为String,以及如何将String转换为对象列表。这称为序列化。

有很多方法可以做到这一点,包括转换为JSON和从JSON转换。最简单的方法之一是使用Java Serialization API。这些的主要缺点是,如果稍后在保存记录后更改Java代码中对象的定义,则它们可能无法反序列化(加载)对象。

以下是从this related answer获取的与String相关的savedBeacons数组转换示例。请注意,下面的代码假定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()));

答案 1 :(得分:2)

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

答案 2 :(得分:2)

有一个可以轻松解决此类问题的库

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

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

SAVE ::

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();

RETRIEVE ::

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