ContentValues、Bundle区别

2017/3/3 17:5 下午 posted in  Android  

ContentValues用于SQLiteDatebase、ContentResolver。

实现上的区别:

  1. ContentValues内部使用HashMap存储数据;Bundle继承自BaseBundle,BaseBundle内部使用ArrayMap存储数据,ArrayMap继承自Map,与HashMap相比主要在于内存效率较高,通常用于存储少量数据。
  2. 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;
       }
   }
}