【问题标题】:Android - Database with ContentValue with boolean bug?Android - 带有布尔错误的 ContentValue 数据库?
【发布时间】:2012-10-17 05:05:21
【问题描述】:

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

但这很奇怪。

为什么我在getAsBoolean 函数中总是得到falseContentValues 类中是否有任何错误?其他人有这个问题吗?

【问题讨论】:

    标签: android sqlite boolean


    【解决方案1】:

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

    在我看来,这像是一个 Android 错误。

    【讨论】:

    【解决方案2】:

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

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

    ContentValues.getAs 如果可以找到键,则返回一个值,如果找不到或无法转换该值,则返回 null。确保您正在进行全面测试。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我不知道这是否是解决这个问题的最佳方法,但下面的代码对我有用:

        Integer result = contentValues.getAsInteger(attributeName);
                    if(result ==  null || result == 0) {
                        parameter = false;
                    } else {
                        parameter = true;
                    }
        

        【讨论】:

          【解决方案5】:

          得到如下布尔结果:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-11
            • 2023-01-23
            • 1970-01-01
            • 2011-07-24
            • 1970-01-01
            • 2012-08-17
            相关资源
            最近更新 更多