【问题标题】:How to store key-value pairs in a file that will be stored in internal memory in Android?如何将键值对存储在将存储在Android内部存储器中的文件中?
【发布时间】:2011-09-01 10:12:24
【问题描述】:

我有一些信息需要存储在内存中。我想以键值对的形式存储它在 SharedPreferences 中的方式。我正在考虑创建 JsonObject 并以这种方式保存和检索。还有其他方法可以将数据以键值对的形式保存在内存中吗?

【问题讨论】:

  • 我能否将 Hashmap 存储在一个文件中,然后稍后再检索它?
  • 使用 hashmap 是一个更好的主意还是创建和存储 json 对象?我猜 Json 对象是轻量级的。

标签: android memory key-value internals keyvaluepair


【解决方案1】:

存储对象数据的标准 java 方法是使用序列化 - 这就是它的用途。在大多数情况下,实现 Serializable 是相当直接的。 This Site 提供了一个很好的序列化基础教程,可以很容易地适应 Android 环境。

通过创建 HashMap,您可以将 HashMap 序列化为文件,以便轻松检索键/值形式的数据。几乎所有的库集合都支持 Serializable,因此您还可以存储其他类型的 Map/List。

那么使用哪个 - 序列化或 JSONObject?这实际上取决于效率的重要性以及您要存储的内容的复杂程度。

通常,在这两种情况下,最大的成本是将数据写入文件的实际操作,因此,由于 JSONObjects 几乎总是更小更简单,它们可能会更快一些。这对于存储可以轻松转换为 JSON 的字符串或非常简单的对象非常有用,如果您有一个非常复杂的类,其中包含数十个成员和许多可能的状态,则使用序列化可能更简单且高效。在大多数情况下,这些选项之间的实际成本差异可以忽略不计,并且只有在您必须执行多次读取和写入时才真正重要。

因此,对基本类型使用 JSON,对复杂类型使用序列化(您甚至可以将序列化对象存储在 JSON 对象中!)

【讨论】:

    【解决方案2】:

    一个非常基本的 SQLiteDatabase 将完成这项工作。那里有大量教程,您只需要一个包含 3 列的表:_id、key、value。

    我个人认为This Tutorial 是一个很好的起点。

    DB 总是需要一个上下文来让球滚动,所以对于像这样简单的 get/set 情况,创建一个具有以下方法签名的小类将使生活变得非常简单:

    public static void set(Context context, String key, String value);
    public static String get(Context context, String key);
    

    对于更复杂的对象,使用 Parcelable 或 Serialization:

    public static void set(Context context, String key, Serializable value);
    public static Serializable(Context context, String key); 
    

    【讨论】:

    • 非常感谢,但我已经了解数据库和 SharedPreferences。我只需要将信息保存在内部存储器中,因为即使用户清除应用程序的缓存,该信息也不应该丢失。
    • 使用 SQLiteDatabase 保存到内存中。您可以选择是否将其保存在缓存部分。
    • 抱歉,您的问题并未说明您要求数据“无法清除”。我不确定是否要防止 DB 擦除,但我认为这仅适用于系统应用程序。
    猜你喜欢
    • 2012-07-18
    • 2012-10-21
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多