如何遍历所有Bundle对象

时间:2012-08-10 17:10:23

标签: android bundle sharedpreferences

我正在尝试创建一个以Bundle方式迭代所有generic个对象的辅助方法。

“通用”我的意思是:

  1. 不需要知道作为参数传递的Bundle中对象的名称(键)。
  2. 如果将来另一个成员(密钥)添加到Bundle中,则无需更改。
  3. 到目前为止,我想出了以下概要来实现这一目标:

      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.
            }
        } 
      }
    

    这种方法有意义吗?

    有没有更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:66)

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

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

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

答案 1 :(得分:3)

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

所以基本算法是:

  1. 从包中获取对象
  2. 上课
  3. 查看班级是否在地图中
  4. 如果是,请调用指定的方法将其放入SharedPreferences
  5. 如果不是,请获取它的超类并返回步骤3.
  6. 如果你一直到java.lang.Object,那么你就有了一个无法立即存储在SharedPreferences中的捆绑对象。取决于您可能想要尝试处理此类的方式,或者您可能只想记录错误并继续前进。如果不知道为什么你正在做这件事,就不可能猜出当方法失败时你应该如何反应。除非你完全控制了捆绑和首选项,否则它总是会有所不同,但是如果你有足够的控制权,就没有必要跳过所有这些环节,因为你可以更简单直接地定义你自己的密钥。
  7. 注意:反射速度不快,并且编码和维护不是最容易的事情。如果可能的话,我建议找一个适合你用例的不太通用的方法。