40

我正在尝试创建以通用方式遍历所有Bundle对象的辅助方法。

“通用”是指:

  1. 不需要知道 Bundle 中作为参数传递的对象的名称(键)。
  2. 如果将来将另一个成员(密钥)添加到 Bundle 中,则不需要更改。

到目前为止,我想出了以下大纲来实现这一点:

  private void bundleToSharedPreferences(Bundle bundle) {
    Set<String> keys = bundle.keySet();
    for (String key : keys) {
        Object o = bundle.get(key);
        if (o.getClass().getName().contentEquals("int")) {
            // save ints
        }
        else if (o.getClass().getName().contentEquals("boolean")) {
            // save booleans
        }
        else if (o.getClass().getName().contentEquals("String")) {
            // save Strings
        }
        else {
            // etc.
        }
    } 
  }

这种方法是否有意义?

有没有更好的方法来实现这一点?

4

2 回答 2

85

您可以使用 toString() 方法将所有内容保存为字符串吗?不知道原始类型是否映射到它们的 Object 等价物(例如 int 到类 Integer),但如果是,那么您也许可以做这样的事情,而不是费力地检查每个可能的类。

 for (String key : bundle.keySet()) {
        saveKeyValueInPrefs(key, bundle.get(key).toString()); //To Implement
 }

不确定这是否适合您的需求,但我现在正在尝试做类似的事情来将包转换为 JSON 字符串。

于 2013-06-11T15:29:09.747 回答
3

如果我真的要这样做,我会通过反思来做到这一点。存储一个静态映射,以便 String.class 映射到 SharedPreference.putString() 等。然后,当您循环遍历这些项目时,对照映射检查它们的类。如果它不存在,请检查超类等。这将为您提供正确的调用方法,或者让您知道所请求对象的类型不是可以放入首选项的东西。

所以基本算法是:

  1. 从包中获取对象
  2. 获取它的类
  3. 查看课程是否在地图中
  4. 如果是,则调用指定的方法将其放入 SharedPreferences
  5. 如果不是,则获取它的超类并返回第 3 步。
  6. 如果您一直到 java.lang.Object,那么您就有一个无法立即存储在 SharedPreferences 中的捆绑对象。根据您在此过程中遇到的类,您可能也想尝试处理这个问题,或者您可能只想记录错误并继续前进。在不知道为什么要这样做的情况下,无法猜测当方法失败时应该如何反应。除非您完全控制捆绑包和首选项,否则它总是会的,但是如果您拥有如此多的控制权,则无需跳过所有这些障碍,因为您可以更直接,只需定义自己的键。

注意:反射并不快,也不是最容易编码和维护的东西。如果可能的话,我建议找到适合您用例的不太通用的方法。

于 2012-08-14T18:26:08.053 回答