【问题标题】:How to save and load the object's list to SharedPreferences with/without using Gson?如何使用/不使用 Gson 将对象的列表保存并加载到 SharedPreferences?
【发布时间】:2016-04-22 16:47:53
【问题描述】:

在我的 Android 应用程序中,我使用 Gson 来在 SharedPreferences 中保存/加载对象的 Arraylist。以下是我使用 Gson 的代码。

public static ArrayList<RequestModal> getModalList(Context ctx) {
    Gson gson = new Gson();
    String json = getSharedPreferences(ctx).getString("ModalList", new Gson().toJson(new ArrayList<>()));
    Type type = new TypeToken<ArrayList<RequestModal>>() {}.getType();
    return gson.fromJson(json, type);
}

这里的“RequestModal”是一个简单的对象,包括一些字符串和整数。 在“在线”的情况下效果很好。但如果互联网处于离线状态,则永远适用于以下代码。

Type type = new TypeToken<ArrayList<RequestModal>>() {}.getType();

我该如何解决?使用/不使用 Gson 实现这样的功能的方式是什么?请任何有好主意的人帮助我。 提前谢谢你。

【问题讨论】:

  • 它在“在线”的情况下运行良好。但是,如果互联网处于离线状态,则永远适用于以下代码。 ---> 我不会把你带到这里。您的代码如何依赖互联网?
  • 是的,你是对的。我的代码独立于互联网。但是一旦网络离线,它就永远在“TypeToken>() {}.getType();”上工作,不会停止或崩溃。

标签: java android gson sharedpreferences


【解决方案1】:

你可以在没有 Gson 的情况下实现这个:

public static EpisodeDetails parseEpisodeDetails(String content) {
    EpisodeDetails episodeDetails = new EpisodeDetails();
    try {
        JSONObject jsonObject = new JSONObject(content);
        episodeDetails.title = jsonObject.getString("title");
        episodeDetails.subTitle = jsonObject.getString("subtitle");
        episodeDetails.synopsis = jsonObject.getString("synopsis");
        episodeDetails.ends_on = jsonObject.getString("ends_on");

        JSONArray images = jsonObject.getJSONArray("image_urls");
        if (images.length() > 0) {
            episodeDetails.image_url = images.getString(0);
        }

    } catch (JSONException e) {
        e.printStackTrace();
        return null;
    }
    return episodeDetails;
}

我正在做的只是获取字符串,在您的情况下,保存在共享首选项中的字符串称为 ModalList 并在我的结构中插入值,在我的代码中,该结构称为 EpisodeDetails,在您的代码中通讯员是RequestModal。如果你不想通过代码来做,想尝试另一个库,我推荐 Jackson。

另一件事,在这一行:

String json = getSharedPreferences(ctx).getString("ModalList", new Gson().toJson(new ArrayList<>()));

您的第二个参数不是必需的。 getString 将要加载的键作为第一个参数,将默认值作为第二个参数(在结果为空的情况下)。您可以将其更改为 ""null

【讨论】:

    【解决方案2】:

    嗯,您的问题的另一个解决方案可能是TinyDB。它利用GsonArrayLists的对象保存在sharedPrefs中,其用法很简单:

    Person person = new Person("john", 24);
    tinydb.putObject("user1", person);
    
    ArrayList<Person> usersWhoWon = new ArrayList<Person>();
    tinydb.putListObject("allWinners", usersWhoWon);
    

    就是这样,查看我上面给出的链接以查看使用详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2018-09-16
      • 2020-09-13
      • 1970-01-01
      • 2013-01-20
      • 2017-12-28
      • 1970-01-01
      相关资源
      最近更新 更多