为什么ContentValues有一个支持布尔的put方法?

ContentValues类包含一个允许将布尔值放入值集合的方法。 AFAIK,SQLite不包含Android可以推送布尔值的原生布尔格式。 那么,Android在后台存储这些值有什么魔力呢?

另外,为什么在Cursor上没有getBoolean方法? 对我来说,这似乎是一个相当尴尬的devise监督,因为似乎没有“安全”的方式来检索通过ContentValues放入数据库的布尔值。 我错过了什么?

这个问题似乎有点轻浮,因为我怀疑布尔值被存储为1或0的整数,但是为什么Android会向开发者做出这样的假设呢? 就我所知,它甚至没有logging。

Solutions Collecting From Web of "为什么ContentValues有一个支持布尔的put方法?"

ContentValues类包含一个允许将布尔值放入值集合的方法。 AFAIK,SQLite不包含Android可以推送布尔值的原生布尔格式。 那么,Android在后台存储这些值有什么魔力呢?

从阅读这个文档,这听起来像布尔到整数的转换是由SQLite完成的。

另外,为什么在Cursor上没有getBoolean方法? 对我来说,这似乎是一个非常糟糕的devise监督,因为似乎没有“安全”的方式来检索通过ContentValues放入数据库的布尔值。 我错过了什么?

如果您正在从游标读取数据,那么您知道查询应该返回哪些列,因此您可能知道请求的列的数据types。 我同意有一个getBoolean方法会更好,但它不是很难解决。

UPDATE

Google已经修补了前面提到的错误,虽然在这篇文章中还没有实现:

https://code.google.com/p/android/issues/detail?id=232274


值得注意的是,目前的API是危险的,如果有什么改变,可能会破坏你的应用程序。

此外, ContentValues.getBoolean还有一个主要问题,如果使用DatabaseUtils.cursorRowToContentValues创buildContentValues ,它将把每个字段视为一个string:

values.put(columns[i], cursor.getString(i));

当你通过ContentValues.getBoolean检索字段时,你总是会得到错误:

 if (value instanceof CharSequence) { return Boolean.valueOf(value.toString()); 

由于值为“0”或“1”,因此该转换失败:

 private static boolean toBoolean(String name) { return ((name != null) && name.equalsIgnoreCase("true")); 

所以我强烈build议你创build自己的getter和setter,这样你的行为就可以很好地定义了。