我在程序中有一个小列表,我想让用户保存它,而不是每次应用程序启动时都填充它。
名单:
public static ArrayList<BeaconDevice> SavedBeacons;
通常包含最多5-10个BeaconDevice对象.
BeaconDevice是一个对象,包含AltBeacon对象(来自AltBeacon库)和字符串格式的名称。
什么是最好的方法?
发布于 2016-11-29 05:11:35
这类东西有一个库,它有一个简单的解决方案。
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);发布于 2016-11-29 00:46:37
问题的实质是序列化和持久化对象,然后反序列化对象。有很多方法可以做到这一点,--更健壮和更复杂的解决方案--通常涉及一个数据库,通常是安卓上的SQLite,以及一些对象关系映射框架。
但是,在本例中,这种健壮的解决方案可能会导致过度使用,因为用例用于序列化和保存一个非常小的对象列表,其中每个对象的字段数量有限。在Android上保存小块数据的最常见方法是共享首选项。您可以通过以下方法获得对管理这些对象的对象的引用:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);有了这个之后,就可以使用如下代码将String保存到持久存储中:
SharedPreferences.Editor editor = preferences.edit();
editor.putString("savedBeacons", savedBeaconsAsString);
editor.apply();然后像这样把它们装回去:
String savedBeaconsAsString = preferences.getString("savedBeacons", null);当然,以上只是将单个字符串保存到持久存储中。如何将对象列表转换为字符串,以及如何将字符串转换为对象列表。这称为序列化。
有很多方法可以做到这一点,包括转换到和从JSON。最简单的方法之一是使用Java序列化API。它们的主要缺点是,如果稍后在保存记录之后更改Java代码中的对象定义,则它们可能无法反序列化(加载回)对象。
下面是一个将savedBeacons数组转换为从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()));发布于 2016-11-29 00:34:53
如果是一个小列表,可以使用Gson库将列表转换为JSON字符串,并将其保存为SharedPreferences中的字符串。请参考这个答案https://stackoverflow.com/a/15011927/3090173,它本质上提供了相同的用例。
https://stackoverflow.com/questions/40855703
复制相似问题