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

时间:2011-05-02 19:21:40

标签: android sqlite android-contentprovider

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

另外,为什么Cursor上没有免费的getBoolean方法?对我来说,这似乎是一个非常尴尬的设计疏忽,因为似乎没有“安全”的方法来检索通过ContentValues放入DB的布尔值。我错过了什么?

这个问题可能看起来有点轻浮,因为我怀疑布尔值存储为1或0整数,但为什么Android会向开发人员提出这个假设呢?据我所知,它甚至没有记录。

2 个答案:

答案 0 :(得分:10)

  

ContentValues类包含一个   允许布尔人放置的方法   进入价值集合。据我所知,   SQLite不包含本机   Android可以推送的布尔格式   将布尔值转换为。所以呢   魔术确实在Android背后做了   存储这些值的场景?

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

  

另外,为什么没有免费赠品   Cursor上的getBoolean方法?对我来说,   这看起来非常糟糕   设计监督,因为似乎   没有“安全”的方法来检索   放入DB的布尔值   通过ContentValues。我错过了什么?

如果您正在从游标中读取,那么您知道应该从查询返回哪些列,因此您可能知道所请求的列的数据类型。我同意采用getBoolean方法会更好,但解决起来并不难。

答案 1 :(得分:1)

更新

Google修补了之前提到的错误,但在此帖发布时尚未实施:

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

值得注意的是,当前的API很危险,如果发生任何变化,可能会破坏您的应用程序。

此外,ContentValues.getBoolean还有一个主要问题,如果您使用ContentValues创建DatabaseUtils.cursorRowToContentValues,它会将每个字段视为字符串:

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"));

因此,我强烈建议您创建自己的getter和setter,以便明确定义您的行为。