我正在尝试创建一个以Bundle方式迭代所有generic个对象的辅助方法。
“通用”我的意思是:
到目前为止,我想出了以下概要来实现这一目标:
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.
}
}
}
这种方法有意义吗?
有没有更好的方法来实现这个目标?
答案 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()等。然后,当您循环遍历项目时,请检查它们的类与地图。如果它不存在,请检查超类等。这将为您提供正确的调用方法,或者让您知道所请求的对象的类型不是可以放入首选项的内容。
所以基本算法是:
注意:反射速度不快,并且编码和维护不是最容易的事情。如果可能的话,我建议找一个适合你用例的不太通用的方法。