【问题标题】:What causes Android's ContentResolver.query() to return null?是什么导致 Android 的 ContentResolver.query() 返回 null?
【发布时间】:2012-10-16 08:12:42
【问题描述】:

ContentResolver.query() 在什么情况下返回 null 而不是游标对象?我之前得到了空游标,但刚刚意识到该方法也可以返回 null。不过,我无法追踪发生这种情况的情况。

【问题讨论】:

    标签: android


    【解决方案1】:

    由于我今天收到我的应用程序的用户崩溃报告,我刚刚偶然发现了同样的问题。如果 Android 文档对某些内容不清楚,则查看源代码会有所帮助。这就是我发现ContentResolver.query()返回null的原因:

    1. 无法获取内容提供者。这可能是由于指定的Uri 存在问题,或者因为它根本不存在于系统中。如果 Uri 是问题,原因是:协议不是 content:// 或 Uri 没有权限字符串部分(Uri.getAuthority() == null)。

    2. 获取的提供者的query method本身返回null

    3. 可以获取内容提供程序,但在查询期间抛出了 RemoteException

    尤其是因为 (2.),由于没有定义任何规则,因此导致 null 的原因几乎是任意的。但通常情况下,如果 SQLite 是 ContentProvider 的后端,那么您至少可以期望得到一些空的 Cursor 对象,而不仅仅是 null

    Android 系统 ContentProviders 在返回任何内容之前会进行一些检查。如果输入与预期不符,则不太可能返回 null。但老实说,这在我以前从未发生过。如果出现查询参数问题,我通常会收到IllegalArgumentException。如果结果集为空,某些 ContentProvider 实现可能会返回 null

    无论如何。似乎有必要始终检查 null。尤其是原因号 (3.) 可能会在任何 Android 设备上发生。

    【讨论】:

    • 由于某些事情似乎很少发生(案例 3),我们应该总是检查 null 是多么蹩脚。
    • 在我的例子中,链接是contnet://XXX 而不是content://XXX,该死
    • @tiguchi 你能帮我解决我最近的问题吗?
    • @MickeyTin 哇。我花了一分钟才找到它们之间的区别。下次你最好使用SCHEME_CONTENT XD。
    【解决方案2】:

    ContentResolver.query 如果 uri 方案不是 content:// 的形式,或者方案本身的 contentProvider 不存在,则返回 null。

    【讨论】:

      【解决方案3】:

      ContentResolver.query() 在下列情况下会返回 null:

      1. 如果您尝试传递数据库中不存在的列名(一个非常常见的情况是开发人员使用常量作为列 名称,因为它们看起来类似于列)。

      2. 很可能为 null,因为您的 URI 参数无效。

      可能在其他情况下它会返回 null。但是,以上两种情况是开发人员拉扯头发的非常常见的原因:)

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。我的错误是没有关闭提供者的游标,因此以后的查询调用会导致 null。

        【讨论】:

        • 就是这个。如果您不关闭光标,随后的查询可能会或可能不会起作用(最终会将 URI 返回为 null)。我在上面坐了一个小时左右,然后看到了这个。 +1
        • 以下查询如何返回null?
        【解决方案5】:

        如果您忘记在清单中声明提供程序,您的查询可能会返回 null。

        【讨论】:

          【解决方案6】:

          如果没有结果,则返回null。我的意思是说,如果给定的数据库查询没有结果(甚至没有一行数据),那么 query() 返回 null。

          【讨论】:

          • 我以为我之前得到了空的光标对象,但我可能弄错了……你在任何半官方的地方看到过这个吗?
          • 不。我以前总是有测试数据。
          • 如果没有结果则不返回“null”。它只返回一个空光标。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-17
          • 1970-01-01
          • 2017-02-17
          • 2011-05-19
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          相关资源
          最近更新 更多