¿Puedo realizar esta consulta de Android con ContentResolver.query ()? (LEFT JOIN y CASE)

Estoy buscando para realizar la siguiente consulta (en pseudo-código) en Android:

SELECT C.ID, C.NAME, CASE ISNULL(G.GROUPID,0) = 0 THEN 0 ELSE 1 END INGROUP FROM CONTACTS C LEFT JOIN GROUPMEMBERSHIP G ON G.CONTACTID = C.ID AND G.GROUPID = ? 

Estoy buscando para seleccionar el ID y nombre de todos los contactos en la libreta de direcciones del sistema, a través de los contactos predeterminados ContentProvider, junto con un campo 0/1 que indica si el contacto es un miembro del grupo ? .

Por supuesto, podría obtener todos los contactos lo suficientemente fácil, a continuación, realizar un bucle y consultar la membresía por separado lo suficientemente fácil en mi clase de adaptador, pero me imagino la realización de las dos consultas como una consulta externa unido daría rendimiento mucho mejor.

¿Puedo hacer esto con el estándar de alto nivel de secuencia de proyección y ContentResolver.query() método? ¿O este tipo de consulta requeriría excavar en una ejecución SQL más directa?

Nope, no puede hacer ese tipo de consultas con el método ContentResolver.query() . Necesitará escribir algo como esto:

 SQLiteDatabase db = YourActivity.getDbHelper().getReadableDatabase(); String query = yourLongQuery; Cursor c = db.rawQuery(query, null); YourActivity.startManagingCursor(c); c.setNotificationUri(YourActivity.getContentResolver(), YourContentProvider.CONTENT_URI); 

Editar: Bueno, por lo que en realidad no se resuelve la pregunta, porque eidylon está vinculado a un ContentProvider existente como se menciona en su pregunta. Sin embargo, esto cubre cómo realiza una JOIN si posee el origen y API de ContentProvider. Así que lo dejaré para aquellos que quieran saber cómo manejar ese caso.


¡Esto es facil! Pero intuitivo … 🙂

 query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 

Bueno, ¿qué es URI? Normalmente, tiene un URI por tabla.

content://com.example.coolapp.contacts sirve datos de su tabla content://com.example.coolapp.contacts . content://com.example.coolapp.groupmembers sirve datos de su tabla GROUPMEMBERSHIP .

Pero URI es realmente sólo una cadena. Úsalo como quieras. Haga un bloque de código en su ContentProvider que responda al content://com.example.coolapp.contacts_in_group . Dentro de ese bloque de código en el ContentProvider, puede obtener acceso en bruto a su base de datos SQLite, sin restricciones por el modelo de datos de query() limitada query() . ¡Sientase libre de usarlo!

Defina los campos de selección como desee. No tienen que asignar a los nombres de columnas de la tabla – mapas de cómo es necesario, con el fin de obtener sus parámetros en.

Defina su proyección como usted necesita – Puede contener columnas de ambas tablas después de la unión.

Bing, ya está. Google hace este mismo modelo internamente en su propio código – Ve a la API de proveedores de contactos – ve "bla.RawContact" y "bla.Contact" y etc como URI de contenido. Cada uno sirve datos de la misma tabla en el DB – los diferentes URIs sólo ofrecen diferentes vistas de la misma tabla!

No puede hacerlo porque ContentResolver sólo tiene un método de consulta:

  query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 

No hay ningún parámetro para tablas o cláusulas FROM.

  • Almacenamiento de etiquetas de música en una base de datos SQLite
  • ¿Cómo puedo hacer que sea más difícil para los jugadores hackear datos de nivel de juego?
  • Compruebe si la consulta SQL ha tenido éxito en Android SQLite
  • Android SQLite ON CONFLICT UPDATE es posible?
  • Sqlite actualiza una columna basada en la cláusula where android
  • ¿Cómo usar una clase de contrato en android?
  • SQLite SUM y LIMIT no parecen funcionar juntos
  • Ormlite interior ensambla en tres tablas
  • ¿Consulta para obtener registros basados ​​en Radius en SQLite?
  • Comprobar si existe una entrada en una base de datos
  • Android rawQuery - ¿Hay una manera de usar "IN" parametrizada para una colección de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.