ContentValues用于SQLiteDatebase、ContentResolver。
实现上的区别:
- ContentValues内部使用HashMap存储数据;Bundle继承自BaseBundle,BaseBundle内部使用ArrayMap存储数据,ArrayMap继承自Map,与HashMap相比主要在于内存效率较高,通常用于存储少量数据。
- get数据时,ContentValues返回的是包装类型,Bundle返回的是基本类型;类型转换的方式不同,Bundle是直接进行类型转换,转换异常则返回默认值,ContentValues先尝试直接进行类型转换,转换异常,则判断是否是CharSequence等其他类型,若是则再尝试由该类型进行转换。
Bundle中get方法:
public int getInt(String key, int defaultValue) {
unparcel();
Object o = mMap.get(key);
if (o == null) {
return defaultValue;
}
try {
return (Integer) o;
} catch (ClassCastException e) {
typeWarning(key, o, "Integer", defaultValue, e);
return defaultValue;
}
}
ContentValues中的get方法:
public Float getAsFloat(String key) {
Object value = mValues.get(key);
try {
return value != null ? ((Number) value).floatValue() : null;
} catch (ClassCastException e) {
if (value instanceof CharSequence) {
try {
return Float.valueOf(value.toString());
} catch (NumberFormatException e2) {
Log.e(TAG, "Cannot parse Float value for " + value + " at key " + key);
return null;
}
} else {
Log.e(TAG, "Cannot cast value for " + key + " to a Float: " + value, e);
return null;
}
}
}
public Boolean getAsBoolean(String key) {
Object value = mValues.get(key);
try {
return (Boolean) value;
} catch (ClassCastException e) {
if (value instanceof CharSequence) {
return Boolean.valueOf(value.toString());
} else if (value instanceof Number) {
return ((Number) value).intValue() != 0;
} else {
Log.e(TAG, "Cannot cast value for " + key + " to a Boolean: " + value, e);
return null;
}
}
}