5

我在我的 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; 

但这很奇怪。

为什么我总是falsegetAsBoolean函数中?课堂上是否有任何错误ContentValues?还有其他人有这个问题吗?

4

5 回答 5

7

DatabaseUtils.cursorRowToContentValues()将所有内容存储为字符串(blob 除外)。ContentValues.getAsBoolean()将尝试将字符串转换为布尔值(使用 Boolean.valueOf()),但这仅在字符串等于“true”而不是“1”时才有效。

对我来说,这看起来像是一个 Android 错误。

于 2013-04-19T23:51:34.677 回答
1

你在这里跳过了一些代码。

你有什么证据证明 values.getAsBoolean("mybool") 返回假?你必须返回一个布尔值。你是怎么检查的?

如果可以找到键,则 ContentValues.getAs 返回一个值,如果找不到或无法转换该值,则返回 null。确保你正在做一个完整的测试。

于 2012-10-26T23:46:50.903 回答
0

I don't know if it's the best solution for this problem, but this code below works for me:

Integer result = contentValues.getAsInteger(attributeName);
            if(result ==  null || result == 0) {
                parameter = false;
            } else {
                parameter = true;
            }
于 2013-02-08T17:02:42.113 回答
0

getAsBoolean不返回 aboolean而是一个Boolean包装对象,可以是nullBoolean.FALSEBoolean.TRUE. 如果可以确保没有NULLs,则使用values.getAsBoolean("mybool").booleanValue()获取实际值。

于 2012-10-27T09:40:10.857 回答
0

得到如下布尔结果:

boolean result = values.getAsInteger("mybool") == 1;

于 2016-12-29T14:02:35.623 回答