ContentValues类包含一个允许将布尔值放入值集合的方法。 AFAIK,SQLite不包含Android可以将布尔值推入的本机布尔格式。那么,Android在幕后存储这些值的魔力是什么?
另外,为什么Cursor上没有免费的getBoolean方法?对我来说,这似乎是一个非常尴尬的设计疏忽,因为似乎没有“安全”的方法来检索通过ContentValues放入DB的布尔值。我错过了什么?
这个问题可能看起来有点轻浮,因为我怀疑布尔值存储为1或0整数,但为什么Android会向开发人员提出这个假设呢?据我所知,它甚至没有记录。
答案 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,以便明确定义您的行为。