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