我在我的Android应用程序中创建了数据库表。我使用了这个查询:
CREATE TABLE foo (_id INTEGER PRIMARY KEY AUTOINCREMENT, mybool BOOLEAN)
我在表格中添加了一行,mybool
的值为true
我运行了sqlite3命令来查看表中的值,我看到了:
_id | mybool
----------------------
1 | 1
这是正确的,true
值变为1.
奇怪的是在阅读中。我这样读了这张桌子:
ContentValues values = new ContentValues();
Cursor cursor = db.rawQuery("SELECT * FROM foo", null);
DatabaseUtils.cursorRowToContentValues(cursor, values);
然后我得到了奇怪的结果:
values.getAsBoolean("mybool"); // return false - WRONG
values.getAsInteger("mybool"); // return 1 = true - CORRECT
我使用这样的代码来获取布尔值:
values.getAsInteger("mybool") != 0;
但这很奇怪。
为什么我总是在false
函数中获得getAsBoolean
? ContentValues
课程中是否有任何错误?其他人有这个问题吗?
答案 0 :(得分:6)
DatabaseUtils.cursorRowToContentValues()将所有内容存储为字符串(blob除外)。 ContentValues.getAsBoolean()将尝试将字符串转换为布尔值(使用Boolean.valueOf()),但只有在字符串等于“true”而不是“1”时才有效。< / p>
对我来说,这看起来像是一个Android错误。
答案 1 :(得分:1)
你在这里跳过了一些代码。
您认为values.getAsBoolean(“mybool”)返回false的证据是什么?你必须返回一个布尔值。你好吗?
如果可以找到密钥,则ContentValues.getAs返回一个值;如果不能找到该密钥,则返回null;如果无法转换该值,则返回null。确保你正在进行全面测试。
答案 2 :(得分:0)
getAsBoolean
不会返回boolean
而是Boolean
包装器对象,可以是null
,Boolean.FALSE
或Boolean.TRUE
。
如果您可以确保没有NULL
s,请使用values.getAsBoolean("mybool").booleanValue()
来获取实际值。
答案 3 :(得分:0)
我不知道这是否是解决此问题的最佳解决方案,但下面的代码对我有用:
Integer result = contentValues.getAsInteger(attributeName);
if(result == null || result == 0) {
parameter = false;
} else {
parameter = true;
}
答案 4 :(得分:0)
获取如下的布尔结果:
boolean result = values.getAsInteger("mybool") == 1;