【问题标题】:Android Cursor strange behaviourAndroid光标奇怪的行为
【发布时间】:2010-05-06 09:38:13
【问题描述】:

在一个大型应用程序中搜索了数小时的错误后,我终于找到了错误。此日志记录了问题:

Log.d(TAG,"buildList, DBresult.getInt(1): "+DBresult.getInt(1));
Log.d(TAG,"buildList, DBresult.getString(1): "+DBresult.getString(1));
Log.d(TAG,"buildList, DBresult.getInt(4): "+DBresult.getInt(4));
Log.d(TAG,"buildList, DBresult.getString(4): "+DBresult.getString(4));

结果输出:

05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getInt(1): 0
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getString(1): false
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getInt(4): 0
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getString(4): true

没有运行背景线程。如您所见,问题在于“0”在一种情况下被解释为假,而在另一种情况下被解释为真。由于我完全不知道这是如何发生的,我不知道如何进行。什么可能导致这种行为?这两列都是“布尔”类型,即 sqlite 中的数字。不幸的是,返回的字符串是正确的值,而整数始终为 0。如果我将数据库导出到我的计算机并使用 SQlite Administrator 检查它,我可以看到这些值设置正确,只有 getInt() 函数总是返回 0。我知道这适用于我编写的其他应用程序,但我不知道为什么它停止工作。

我试过在2.0、2.0.1和2.1下编译代码,总是出现。我可以通过获取这样的布尔值使我的应用程序再次可运行:

myBool= (DBresult.getString(0).equals("true"));

但这既丑陋又没有优化。欢迎就导致此行为的原因提出任何建议。

干杯,

【问题讨论】:

  • 能否请您添加插入语句和表格详细信息?
  • 谢谢,由于您的要求,我直接找到了问题的根源 =)
  • 我发现没有实现 getBoolean 方法很有趣。尽管如此,我还是倾向于使用整数而不是布尔值,因为空间太便宜了。

标签: android sqlite cursor


【解决方案1】:

我相信我解决了它: 在更新数据库接口之后,插入之前的所有数据都通过 String.valueOf() 函数转换为字符串。所以不是“1”,而是“真”被输入到数据库中。我的数据库管理工具没有显示差异。为什么用 getInt() 函数将其转换为“0”我不知道,但这似乎是问题所在。

【讨论】:

  • 所以你是说列类型不是“布尔”,而是不小心转换为“字符串”类型的列?
  • 不完全是。该列是用“myColumn boolean not null”之类的东西定义的。但是布尔值在 sqlite 中并不真正存在,而是应该保存为 int,为 0 或 1 (sqlite.org/datatype3.html)。因此,虽然我过去只是将布尔值放在 ContentValues 中,但在更新之后,我将 String.valueOf(boolean) 放在了 ContentValues 中,即字符串“true”或“false”。老实说,我对数据库的了解不够,无法理解这是如何解释的,但这导致了我奇怪的错误,不幸的是,数据库管理工具没有解释这个问题。
  • getInt() 将返回您指定的字段的值。但如果该字段不是 Integer 类型,那么它将使用 Integer.valueOf(),它返回 0,因为它无法转换字符串“true”。
  • 这是有道理的,尽管我几乎希望这种不稳定行为的例外。不过,谢谢,帮助我了解发生了什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多