¿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 ?
.
- Tabla de puntuaciones altas
- Configurar una base de datos de servidor en línea y codificar mi aplicación nativa de Android para interactuar con ella
- Cómo insertar a granel de Json a Sqlite en Android
- Android SQLite - selecciónArgs que no sean cadenas
- comparar sqlite con cadena
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?
- Android, cómo ejecutar un archivo sql en sqlitedatabase
- SQLite de Android - ¿por qué mi DB se vuelve a crear cada vez?
- Cómo implementar una base de datos de objetos de uno a muchos en sqlite para android
- Filtrar entradas en las funciones personalizadas de ContentProvider
- ActiveAndroid Relación de muchos a muchos
- Comportamiento extraño de la consulta SQLite parametrizada
- Cómo utilizar el argumento LIMIT en una consulta SQLite con Android
- Unir 3 tablas en la base de datos SQLite
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.
- ¿Cómo borrar una actividad específica del historial de la pila?
- Establecer el tamaño del texto en .xml o mediante programación