Android - 带有布尔错误的ContentValue数据库?

时间:2012-10-26 22:27:03

标签: android sqlite boolean

我在我的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函数中获得getAsBooleanContentValues课程中是否有任何错误?其他人有这个问题吗?

5 个答案:

答案 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包装器对象,可以是nullBoolean.FALSEBoolean.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;