【问题标题】:How to determine if a column is boolean from cursor object?如何确定一列是否来自游标对象的布尔值?
【发布时间】:2013-03-11 09:19:45
【问题描述】:

我在游标对象中得到了选择查询的结果。我在表中有一些布尔列。 SQLite 中布尔类型的值是 0 或 1,具体取决于它们分别是 false 还是 true。也有 int 类型的列,其值可以为 0 或 1 或其他整数值。我想从光标返回列的值,

if column is of boolean type
   return true if value = 1
   return false if value = 0
else 
   return the same value

我怎样才能做到这一点?

【问题讨论】:

  • 所以你想要如果整数列的值为 1 则返回 true 吗?我有点困惑。
  • @sajmon_d 仅用于布尔列我希望结果为真或假而不是 int
  • @Cthulhu cursor.getType 永远不会返回布尔值。即使对于 boolean 类型,它也会给出整数 :(
  • @Jai SQLite 没有布尔数据类型。您可以尝试以某种方式确定字段的 大小
  • 确定 0 是假还是零通常是不可能的,这是语义。不过,在手动输入值之后,您可以创建一个 boolean[] 数组来为您执行此操作。

标签: android sqlite cursor


【解决方案1】:

如何从光标对象中判断一列是否为布尔值?

所以一开始,SQLite没有布尔类型只有整数、字符串、浮点数、blob。所以我的建议只是测试 int 列的值并根据结果执行适当的操作。

Cursor c = db.rawQuery(query, whereArgs);
int value = 0;
String[] intColumnNames = {columns};
int index = 0;
if (c.moveToFirst()) {
   while (index < intColumnNames.length) {
      do {
         value = c.getInt(c.getColumnIndex(intColumnNames[index]));
         switch (value) {
            case 0:
               // do some action
            break;
            case 1:
               // do some action
            break;
            default:
               // do some action for other cases
            break;
         }
      } while(c.moveToNext());
      index++;
   }
}

【讨论】:

  • 如果其他列有一些 0/1 值怎么办?
  • 感谢您的回答。我也想过同样的解决方案。但是在某些情况下,列类型是 int 并且它们的值是 0 或 1
  • 所以你认为你有更多的 int 列?你想测试所有列,好吗?
【解决方案2】:

因为我之前没有遇到过类似的问题所以我不能发布一个保证的答案。但是您的问题似乎真的很有趣,经过一番搜索后,我认为一种解决方案可能是一种选择..

在读取确定列数据类型的数据之前的第一步。为此,以下链接可能会有所帮助

https://stackoverflow.com/a/6298521/931982

https://stackoverflow.com/a/3106349/931982

如果你发现列类型是布尔型,那么就按照其他两个成员提供的任何解决方案。

注意这不是一个确定的答案,只是发表了我的想法。我会对此发表评论,但它太大而无法在评论中写:(

【讨论】:

    【解决方案3】:

    虽然 SQLite 确实没有 BOOLEAN 存储类型,但没有什么可以阻止您将具有 BOOLEAN 的列定义为数据类型。它将被存储为 NUMERIC。您的应用程序可以使用 PRAGMA table_info( 来获取数据类型,并且只检查它是否为 BOOLEAN。

    【讨论】:

      【解决方案4】:

      试试这个

      int columnNumber = 11;
      while (cursor.moveToNext()) {
         if( cursor.getInt(columnNumber) > 0){
      //true
      }
      
      }
      

      由于 sqlite 中没有布尔数据类型才能使用布尔值,因此您需要具有数据类型 INTEGER SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true). More Details

      【讨论】:

      • 这对于其他整数类型的列类型将失败
      • @Jai 阅读我编辑的答案,如果您不知道系统的进出,请不要投反对票
      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2011-03-02
      • 2019-11-29
      • 2021-07-01
      • 2020-03-30
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多