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

77
在什么情况下,ContentResolver.query() 方法会返回 null 而不是一个游标对象呢?我以前遇到过空游标,但刚刚才意识到该方法也可能返回 null。尽管如此,我还是无法追踪它发生的情况。
6个回答

74

我因为收到一个用户崩溃报告而遇到了同样的问题,该应用程序是我的一个应用。如果Android文档中有不清楚的地方,可以查看源代码。以下是我发现的关于ContentResolver.query()返回null的原因:

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

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

  3. 虽然进行了查询,但是出现了RemoteException异常。

特别是由于(2.),null作为结果可能有很多任意的原因,因为没有定义规则。但通常,如果SQLite是ContentProvider的后端,您至少可以期望得到一些空的游标对象作为结果,而不是只有null

Android系统的ContentProvider在返回任何内容之前都要进行一些检查。如果输入与预期不同,则可能会返回null的几率很小。但说实话,在查询参数问题的情况下,这从未发生过在我的程序中。也许某些ContentProvider实现在结果集为空时返回null

无论如何,似乎有必要始终检查null。特别是第三个原因可能会在任何Android设备上发生。

我们总是因为某些很少发生的情况(第三种情况)而不得不检查 null,这真是太烦人了。 - RestInPeace
2
在我的情况下,链接是 contnet://XXX 而不是 content://XXX,该死的。 - Mickey Tin
@tiguchi,你能帮我解决最新的问题吗? - Bhavya Gupta
1
@MickeyTin 哇,我花了一分钟才找到它们之间的区别。下次最好使用SCHEME_CONTENT XD。 - Sourav Kannantha B

12

ContentResolver.query 如果uri的格式不是 content:// 或相应的 contentProvider 不存在,将返回 null。


2

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

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

  2. 由于 URI 参数无效,很可能为空。

可能有其他情况会返回 null。然而,以上两种情况是开发人员头疼的常见原因 :)


1
我遇到了同样的问题。我的错误是没有关闭提供程序的游标,导致后续的查询调用为空值。

这就是答案。如果你不关闭游标,接下来的查询可能会工作或者不工作(最终将返回空URI)。 我花了一个小时左右才看到这个。+1 - djo
以下查询语句将如何返回 null? - Magudesh

0

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


-4

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


1
我曾经以为我已经收到了空游标对象,但我可能是错的...你有在任何半官方的地方看到这个被写过吗? - anyweez
不,我以前总是有测试数据的。 - Charan
如果没有结果,它不会返回“null”,而是返回一个空游标。 - efeyc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接