在大型应用程序中搜索了很多小时的错误后,我终于找到了错误。此日志记录捕获了问题:
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”在一种情况下被解释为假,而在另一种情况下被解释为真。由于我完全不知道这是怎么发生的,所以我不知道如何进行。什么可能导致这种行为?两列都是“ bool 值”类型,即 sqlite 中的数字。不幸的是,返回的字符串是正确的值,而整数始终为 0。如果我将数据库导出到我的计算机并使用 SQlite Administrator 检查它,我可以看到值设置正确,只有 getInt() 函数总是返回 0。我知道这在我编写的其他应用程序中有效,但我不知道为什么它停止工作。
我试过在2.0、2.0.1、2.1下编译代码,总是出现。我可以通过获取这样的 bool 值让我的应用程序再次运行:
myBool= (DBresult.getString(0).equals("true"));
但这既丑陋又没有优化。欢迎就导致此行为的原因提出任何建议。
干杯,
最佳答案
我相信我解决了它: 在更新数据库接口(interface)之后,插入之前的所有数据都通过 String.valueOf() 函数转换为字符串。因此,数据库中输入的不是“1”,而是“true”。我的数据库管理工具没有显示出差异。我不知道为什么这会被 getInt() 函数隐藏为“0”,但这似乎就是问题所在。
关于Android Cursor 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780031/