2012-08-10 95 views
26

我正在尝试创建一个帮助方法,该方法将以generic方式遍历所有Bundle对象。如何遍历所有Bundle对象

通过“通用”我的意思是:

  1. 并不需要知道在捆绑的对象的名称(键)作为参数传递。
  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. 
     } 
    } 
    } 

请问这种做法意义可言?

有没有更好的方法来完成这个?

+2

我不认为这个设计有任何意义。您的首选项和捆绑包中的内容不应始终进入捆绑包,因为您需要将特定的密钥映射到首选项中。这些通过密钥来标识,您应该对其进行硬编码。 – JoxTraex 2012-08-10 17:15:07

+0

我认为你是对的。但是有没有任何**理智的方法可以将Bundle保存到(本地)永久存储中? – ateiob 2012-08-10 17:20:30

+0

尝试使用SQLite数据库。 – JoxTraex 2012-08-10 17:21:57

回答

3

我会通过反思去做,如果我真的这样做的话。存储一个静态的Map,使得String.class映射到SharedPreference.putString()等。然后,当你在项目中循环时,根据地图检查他们的类。如果它不存在,请检查超类等。这会给你正确的调用方法,或者让你知道请求的对象的类型不是可以放入偏好的东西。

所以基本的算法是:

  1. 从包
  2. 获取对象获得同级车
  3. 若见类是在地图上
  4. 如果是,调用指定的方法将其放入SharedPreferences中
  5. 如果不是,请取得它的超类并返回到第3步。
  6. 如果您将所有方法都设置为java.lang.Obj等等,那么你有一个捆绑的对象,不能立即存储在SharedPreferences中。取决于您沿着这种方式击中了哪些类别,您可能也想尝试处理此类问题,或者您可能只想记录错误并继续前进。不知道为什么你正在这样做,这是不可能猜测当方法失败时你应该如何反应。除非你完全控制了包和偏好,否则它总是会发生变化,但是如果你有了这样的控制权,就不需要跳过所有这些环节,因为你可以更简单明了,只需定义自己的键。

注意:反射不是很快,它不是最简单的代码和维护。如果可能的话,我建议找一个适合你的用例的不太通用的方法。

+1

我将其解释为“*不** **通过所有Bundle对象!*”。接受,因为没有人提供了更好的答案。 – ateiob 2012-08-21 15:10:19

52

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

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

不知道这是否会工作为您的需求,但我试图做类似束转换成JSON字符串现在的东西。