¿Qué causa que ContentResolver.query () devuelva null?

¿En qué condiciones ContentResolver.query () devuelve null en lugar de un objeto cursor? He conseguido cursores vacíos antes, pero sólo se dio cuenta de que el método también puede devolver null. No he sido capaz de rastrear las circunstancias en las que esto sucede.

Acabo de tropezar con el mismo problema debido a un informe del accidente del usuario que recibí hoy para una aplicación mía. Si la documentación de Android no está clara acerca de algo, ayuda a ver el código fuente. Esto es lo que encontré sobre las causas de ContentResolver.query() devolviendo null :

  1. No se puede obtener el proveedor de contenido. Esto puede ser debido a un problema con el Uri especificado o porque simplemente no existe en el sistema. Si el Uri es el problema las causas son: protocolo no es el content:// o el Uri no tiene una porción de cadena de autoridad (Uri.getAuthority () == null).

  2. El método de consulta del proveedor adquirido en sí devuelve null .

  3. El proveedor de contenido se podría adquirir pero se ha lanzado una excepción remota durante una consulta.

Especialmente debido a (2) es bastante arbitrario lo que podría ser la causa de null como resultado ya que no hay reglas definidas. Pero por lo general, si SQLite es el back-end de un ContentProvider puede esperar al menos algún objeto Cursor vacío como resultado en lugar de simplemente null .

El sistema Android ContentProvider s hace algunas comprobaciones antes de que devuelvan algo. Si la entrada no es la esperada, existe la posibilidad improbable de que se devuelva null . Pero para ser honesto, eso nunca me pasó antes. Normalmente obtengo una IllegalArgumentException en caso de problemas con parámetros de consulta. Quizás algunas implementaciones de ContentProvider devuelvan null en caso de conjuntos de resultados vacíos.

De cualquier manera. Parece ser necesario comprobar siempre para null . Especialmente número de la razón (3.) es probablemente algo que puede suceder en cualquier dispositivo Android.

ContentResolver.query devuelve null si el esquema uri no es del content:// del formulario content:// o si el contentProvider para el esquema en sí no existe.

ContentResolver.query () devolverá null en los casos siguientes:

  1. Si intenta pasar nombres de columnas que no existen en la base de datos (un caso muy común es cuando los desarrolladores usan constantes como nombres de columna porque parecen similares a las columnas).

  2. Es probable que sea nulo porque su argumento URI no es válido.

Puede haber otros casos en los que se devolverá nulo. Sin embargo, los dos casos anteriores son razones muy comunes por las cuales los desarrolladores sacan sus pelos 🙂

Yo tuve el mismo problema. Mi error era no cerrar un cursor para el proveedor para que una llamada de consulta posterior conducir a null.

Si se olvida de declarar el proveedor en el manifiesto sus consultas pueden devolver null.

Si no hay ningún resultado, devuelve null. Quiero decir que si la consulta de base de datos dada no produce nada (ni siquiera una sola fila de datos), entonces query () devuelve null.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.