什么原因导致Android的ContentResolver.query()返回null?

ContentResolver.query ()在什么情况下返回null而不是游标对象? 我已经得到空游标,但只是意识到,该方法也可以返回null。 尽pipe如此,我还是无法追踪发生这种情况的情况。

由于我今天收到了一个我的应用程序的用户崩溃报告,我只是偶然发现了同样的问题。 如果Android文档不清楚的东西有助于看看源代码。 这是我发现有关ContentResolver.query()返回null的原因:

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

  2. 获取的提供者的查询方法本身返回null

  3. 可以获取内容提供者,但是在查询期间抛出了一个RemoteException 。

特别是因为(2),它几乎是任意的,因为没有定义规则,结果可能是null 。 但是通常,如果SQLite是ContentProvider的后端,那么可以期望至less有一些空的Cursor对象,而不是null

Android系统ContentProvider虽然在返回任何东西之前做了一些检查。 如果input不符合预期,则可能返回null 。 但说实话,以前从来没有发生过我。 在查询参数问题的情况下,我通常会得到一个IllegalArgumentException 。 也许一些ContentProvider实现在空结果集的情况下返回null

无论哪种方式。 似乎有必要总是检查null 。 特别是原因(3.)可能是任何Android设备上可能发生的事情。

如果urischeme不是表单content://或者contentProviderscheme本身不存在,则ContentResolver.query返回null。

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

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

  2. 它很可能是空的,因为你的URI参数是无效的。

可能有其他情况下,它将返回null。 但是,以上两种情况是开发者拉头发的常见原因:)

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

我有同样的问题。 我的错误是不closures提供程序的光标,以便以后的查询调用导致null。

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