android sql left-join android-contacts android-contentresolver

¿Puedo realizar esta consulta de Android con ContentResolver.query()?(JUNTA IZQUIERDA y CAJA)



sql left-join (3)

No puedes hacer eso porque ContentResolver solo 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.

Estoy buscando 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 seleccionar la ID y el Nombre de TODOS los contactos en la libreta de direcciones del sistema, a través del Proveedor de Contenido de Proveedores predeterminado, junto con un campo 0/1 que indica si el contacto es miembro de un grupo ? .

Por supuesto, podría obtener todos los contactos con la suficiente facilidad, luego hacer un bucle y consultar la membresía por separado en mi clase de Adaptador, pero me imagino que realizar las dos consultas como una consulta externa unida daría un mejor rendimiento.

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


No, no puedes hacer ese tipo de consultas con el método ContentResolver.query() . Tendrá que 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);


Edit: está bien, así que esto no resuelve la pregunta, porque eidylon está vinculado a un ContentProvider existente como se menciona en su pregunta. Sin embargo, esto cubre cómo hacer una ÚNETE si posee la fuente y la API ContentProvider. Así que lo dejaré para aquellos que quieran saber cómo manejar ese caso.

¡Esto es facil! Pero no intuitivo ... :)

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

Bien, entonces, ¿qué es la URI? Normalmente, tienes un URI por tabla.

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

Pero URI es en realidad sólo una cadena. Úsalo como quieras. Cree 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 directo a su base de datos SQLite, sin restricciones por el modelo de datos de query() limitado. ¡Sientase libre de usarlo!

Define tus campos de selección como quieras. No tienen que asignarse a los nombres de las columnas de la tabla; asigne un mapa de la forma en que lo necesita para obtener sus parámetros.

Defina su proyección según sus necesidades: puede contener columnas de ambas tablas después de la unión.

Bing, has terminado. Google realiza este mismo modelo internamente en su propio código: vaya a la API del proveedor de contactos; verá "bla.RawContact" y "bla.Contact" y etc. como URI de contenido. Cada uno sirve datos de la misma tabla en la base de datos: ¡los diferentes URI solo proporcionan vistas diferentes de la misma tabla!