什么原因导致Android的ContentResolver.query()返回null?
ContentResolver.query ()在什么情况下返回null而不是游标对象? 我已经得到空游标,但只是意识到,该方法也可以返回null。 尽pipe如此,我还是无法追踪发生这种情况的情况。
由于我今天收到了一个我的应用程序的用户崩溃报告,我只是偶然发现了同样的问题。 如果Android文档不清楚的东西有助于看看源代码。 这是我发现有关ContentResolver.query()
返回null
的原因:
-
内容提供者不能被获取。 这可能是由于指定的
Uri
的问题,或者因为它不存在于系统中。 如果Uri是问题的原因是:协议不是content://
或Uri没有权限string部分(Uri.getAuthority()== null)。 -
获取的提供者的查询方法本身返回
null
。 -
可以获取内容提供者,但是在查询期间抛出了一个RemoteException 。
特别是因为(2),它几乎是任意的,因为没有定义规则,结果可能是null
。 但是通常,如果SQLite是ContentProvider
的后端,那么可以期望至less有一些空的Cursor对象,而不是null
。
Android系统ContentProvider
虽然在返回任何东西之前做了一些检查。 如果input不符合预期,则可能返回null
。 但说实话,以前从来没有发生过我。 在查询参数问题的情况下,我通常会得到一个IllegalArgumentException
。 也许一些ContentProvider实现在空结果集的情况下返回null
。
无论哪种方式。 似乎有必要总是检查null 。 特别是原因(3.)可能是任何Android设备上可能发生的事情。
如果urischeme不是表单content://
或者contentProvider
scheme本身不存在,则ContentResolver.query
返回null。
ContentResolver.query()将在下列情况下返回null:
如果您尝试传递数据库中不存在的列名称(一种非常常见的情况是开发人员使用常量作为列名称,因为它们看起来与列相似)。
它很可能是空的,因为你的URI参数是无效的。
可能有其他情况下,它将返回null。 但是,以上两种情况是开发者拉头发的常见原因:)
如果您忘记在清单中声明提供程序,则查询可能会返回null。
我有同样的问题。 我的错误是不closures提供程序的光标,以便以后的查询调用导致null。
如果没有结果,则返回null。 我的意思是说,如果给定的数据库查询结果什么都没有(甚至没有一行数据),然后query()返回null。