72

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

4

6 回答 6

72

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

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

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

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

null特别是因为(2.),由于没有定义规则,因此可能导致结果的原因几乎是任意的。但通常,如果 SQLite 是 a 的后端,ContentProvider您可以期望至少有一些空的 Cursor 对象作为结果,而不仅仅是null.

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

无论哪种方式。似乎有必要始终检查 null。特别是原因号 (3.) 可能会在任何 Android 设备上发生。

于 2013-04-19T15:43:16.200 回答
10

ContentResolver.query如果 uri 方案不属于这种形式content://,或者contentProviderfor 方案本身不存在,则返回 null。

于 2012-10-26T05:14:33.007 回答
2

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

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

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

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

于 2012-10-26T05:15:11.917 回答
1

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

于 2016-02-25T16:21:10.250 回答
0

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

于 2015-05-09T17:56:50.537 回答
-4

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

于 2012-10-26T04:29:22.123 回答