【问题标题】:Odd Cursor Behavior奇怪的光标行为
【发布时间】:2014-06-27 21:36:29
【问题描述】:

我目前正在开发一个应用程序,它使用数据库/内容提供程序来提供从网络中提取并定期存储在本地数据库中的某些位置数据。

我已验证在应用程序中正确创建了数据库,并且通过将应用程序本地数据库的副本导出到 SD 卡以在 SQL 浏览器中查看来填充表中的数据 - 所以数据不是现在不是这里的问题。

通过我的调试过程的几个屏幕截图,奇怪的行为可能会更好地可视化:

所以,最初当我进行查询时,我的所有 Cursor 对象的行数都返回 -1,即使我验证了 SELECT * FROM TABLE_NAME 语句应该返回值,因为数据库我从设备包含行数据。下面看一下调试器步骤:

请注意,最初返回光标时,mCount 显示为 -1。

出于好奇,我添加了 cursor.moveToFirst();调用,这是该步骤之后的屏幕截图:

请注意,游标计数从 -1 变为 3,这对应于正确的行数(因为应用程序仅占 3 个大洲 atm)。不幸的是,这应该是不必要的添加行仍然不能解决我的问题,因为 CursorAdapter.bindView() 和 CursorAdapter.newView() 仍然无法使用结果光标调用。

我对可能导致此问题的原因感到困惑,以及如何解决它?如果有人可以深入了解问题可能是什么,请告诉我。此外,如果需要任何其他代码,例如 SQL 创建语句等,请告诉我 - 但是,正如我已经提到的那样,数据库创建得很好,并且在 Android 应用程序之外对导出的数据库副本执行的查询工作得很好...

最后一件事,该应用程序是为 API 级别 14+ 构建的。

【问题讨论】:

    标签: android android-sqlite android-cursoradapter android-cursor android-cursorloader


    【解决方案1】:

    如果您有一个从数据库读取的 SQL 查询,您可能希望延迟读取该数据,直到您确定要使用它。

    因此,当您调用 rawQuery 时,您将获得对 Cursor 对象的引用。但是还没有读取任何内容。这就是moveToFirst 所做的。它是告诉游标您对运行此 SQL 查询很认真并且想要一个结果的第一件事。

    但是由于您使用的是rawQuery,因此在您尝试使用moveToFirst 获取结果之前,不会将任何内容传递到数据库。

    希望这能回答你的问题。

    【讨论】:

    • 啊,我以前没有意识到这种行为。谢谢。我仍然遇到 CursorAdapter.bindView() 和 CursorAdapter.newView() 没有被调用的问题......但我想这可能是一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多