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

Android 为什么ContentValues有一个支持Boolean的put方法?,android,sqlite,android-contentprovider,Android,Sqlite,Android Contentprovider,ContentValues类包含一个允许将布尔值放入values集合的方法。顺便说一句,SQLite不包含Android可以将布尔值推入的本机布尔格式。那么,安卓在幕后会用什么魔法来存储这些值呢 另外,为什么光标上没有互补的getBoolean方法?对我来说,这似乎是一个相当尴尬的设计疏忽,因为似乎没有“安全”的方法来检索通过ContentValues放入DB的布尔值。我错过了什么 这个问题可能看起来有点无聊,因为我怀疑布尔值存储为1或0整数,但为什么Android会让开发人员做出这样的假设?据

ContentValues类包含一个允许将布尔值放入values集合的方法。顺便说一句,SQLite不包含Android可以将布尔值推入的本机布尔格式。那么,安卓在幕后会用什么魔法来存储这些值呢

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

这个问题可能看起来有点无聊,因为我怀疑布尔值存储为1或0整数,但为什么Android会让开发人员做出这样的假设?据我所知,它甚至没有记录在案

ContentValues类包含一个 允许放置布尔值的方法 进入值集合。就我所知 SQLite不包含本机 Android可以推送的布尔格式 将布尔值转换为。那么,什么 安卓在游戏背后有什么魔力 存储这些值的场景

从阅读文档中可以看出,布尔到整数的转换似乎是由SQLite完成的

还有,为什么没有免费的 光标上的getBoolean方法?对我来说, 这似乎是一个相当可怕的问题 设计疏忽,因为似乎有 没有“安全”的方式检索 放入数据库的布尔值 通过内容值。我错过了什么

如果您是从游标读取,那么您知道应该从查询返回哪些列,因此您大概知道所请求的列的数据类型。我同意使用
getBoolean
方法会更好,但解决这个问题并不难。

UPDATE 谷歌已经修补了前面提到的bug,尽管在发布本文时还没有实现:


值得注意的是,当前的API是危险的,如果有任何变化,它可能会破坏你的应用程序

此外,
ContentValues.getBoolean
存在一个主要问题,即如果使用
DatabaseUtils.cursorRowToContentValues
创建
ContentValues
,则会将每个字段视为字符串:

values.put(列[i],游标.getString(i))

然后,当您通过
ContentValues.getBoolean
检索字段时,您将始终得到false:

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,以便能够很好地定义您的行为。

Erich,在阅读SQLite文档之后,这一切都是有意义的。对安卓来说,不协助记录这件事有点糟糕。如果不了解SQLite的这一特性,它会让开发人员陷入尴尬的境地。无论如何,现在我知道SQLite自动进行这些转换,我知道我可以像以前一样使用整数列。我知道我已经接受了你的答案,但是你的编辑可能会让一些人感到困惑。我在问题中根本没有提到ContentProviders,但我确实这样标记了它,因为它可能与某些人有关。您还可以将ContentValues类直接用于SQLiteDatabase类(不仅仅是ContentProviders)。我认为我的问题在这种情况下更有意义,因为游标应该有一个getBoolean方法来隐藏SQLite实现细节。@Justin:谢谢你的建议。当我重新阅读我的答案时,我认为我没有抓住要点,所以我添加了编辑:)