繁体   English   中英

安卓 保存小数组的简单方法自定义对象列表

[英]Android. Easy way to save small arrayList of custom objects

我的程序列表很小,我想让用户保存它,而不是每次启动应用程序时都要填写它。

名单 :

public static ArrayList<BeaconDevice> SavedBeacons;

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

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

最好的方法是什么?

问题的实质是关于序列化和持久化对象,然后对它们进行反序列化。 有许多方法可以做到这一点,并且更健壮和复杂的解决方案通常涉及一个数据库,通常是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保存到持久性存储中。 如何将对象列表转换为字符串,以及如何将字符串转换为对象列表。 这称为序列化。

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

这是从此相关答案中获取一个字符串字符串之间的转换的示例。 请注意,下面的代码假定saveBeacons是一个数组,而不是代码所示的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()));

如果列表很小,则可以使用Gson库将该列表转换为JSON字符串,并将其另存为String到SharedPreferences中。 请参阅此答案https://stackoverflow.com/a/15011927/3090173 ,其本质上是相同的用例。

有一个用于此类内容的库,具有简单的解决方案

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

因此,通过导入此文件,您可以像这样直接保存/检索您的清单:

救 ::

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM