ContentResolver.query ()在什么情况下返回null而不是游标对象?我之前得到了空游标,但刚刚意识到该方法也可以返回 null。不过,我无法追踪发生这种情况的情况。
6 回答
由于我今天收到的针对我的应用程序的用户崩溃报告,我偶然发现了同样的问题。如果 Android 文档对某些内容不清楚,则查看源代码会有所帮助。这是我发现的ContentResolver.query()
返回原因null
:
无法获取内容提供者。这可能是由于指定的问题
Uri
或因为它根本不存在于系统上。如果 Uri 是问题,原因是:协议不是content://
或 Uri 没有权限字符串部分(Uri.getAuthority() == null)。获取的提供者的查询方法本身返回
null
.可以获取内容提供程序,但在查询期间引发了RemoteException 。
null
特别是因为(2.),由于没有定义规则,因此可能导致结果的原因几乎是任意的。但通常,如果 SQLite 是 a 的后端,ContentProvider
您可以期望至少有一些空的 Cursor 对象作为结果,而不仅仅是null
.
Android 系统ContentProvider
会在返回任何内容之前进行一些检查。如果输入与预期不符,则不太null
可能返回。但老实说,这在我以前从未发生过。我通常会遇到IllegalArgumentException
查询参数问题。null
如果结果集为空,可能会返回一些 ContentProvider 实现。
无论哪种方式。似乎有必要始终检查 null。特别是原因号 (3.) 可能会在任何 Android 设备上发生。
ContentResolver.query
如果 uri 方案不属于这种形式content://
,或者contentProvider
for 方案本身不存在,则返回 null。
ContentResolver.query() 在以下情况下会返回 null:
如果您尝试传递数据库中不存在的列名(一个非常常见的情况是开发人员使用常量作为列名,因为它们看起来与列相似)。
它可能为 null,因为您的 URI 参数无效。
在其他情况下,它可能会返回 null。但是,以上两种情况是开发人员拉扯头发的非常常见的原因:)
我有同样的问题。我的错误是不关闭提供者的游标,因此稍后的查询调用会导致 null。
如果您忘记在清单中声明提供程序,您的查询可能会返回 null。
如果没有结果,则返回 null。我的意思是说,如果给定的数据库查询没有结果(甚至没有一行数据),那么 query() 将返回 null。