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