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

时间:2012-10-26 04:02:09

标签: android

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

6 个答案:

答案 0 :(得分:65)

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

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

  2. 获取的提供商query method本身会返回null

  3. 可以获取内容提供商,但在查询期间抛出了RemoteException

  4. 特别是因为(2.)因为没有定义规则,因此null可能导致ContentProvider的原因非常随意。但通常情况下,如果SQLite是null的后端,那么你可以期望至少有一些空的Cursor对象,而不仅仅是ContentProvider

    Android系统null在返回任何内容之前会做一些检查。如果输入不符合预期,则IllegalArgumentException不太可能返回。但说实话,以前从未发生过这件事。在查询参数问题的情况下,我通常得到null。在空结果集的情况下,某些ContentProvider实现可能会返回{{1}}。

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

答案 1 :(得分:7)

如果uri方案不是ContentResolver.query形式或者方案本身的content://不存在,则

contentProvider返回null。

答案 2 :(得分:2)

  

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

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

  2.   
  3. 由于您的URI参数无效,因此可能为null。

  4.   

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

答案 3 :(得分:1)

我遇到了同样的问题。我的错误是不关闭提供者的Cursor,以便稍后的查询调用导致null。

答案 4 :(得分:0)

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

答案 5 :(得分:-4)

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