05/04/2019Artículo original
Los proveedores de conteido ofrecen dos formas de pasar una cláusula where:
- A través de la URI
- Combinando una cadena y un conjunto de argumentos string-array reemplazables.
En esta entrada vamos a ver ambas.
Imaginemos que queremos recuperar un lugar (De la aplicación FavSites) cuyo id sea 23. Usaríamos el siguiente código:
Activityactivity;//... Inicializamos la actividad...StringsiteUri="content://com.elbauldelprogramador.provider.FavSites/sites/23";CursormanagedCursor=activity.managedQuery(siteUri,projection,//Columnas a devolvernull,//Cláusula WHEREnull);//CláusulaORDERBY
En este ejemplo se ha dejado el argumento que hace referencia a la cláusula where a null ya que hemos especificado el ID del registro que queremos en la URI. En este caso el ID está embebido en la URI. Se usa la URI como vehículo para pasar la cláusula where. Esto se hace evidente cuando nos fijamos cómo se implementa el proveedor para los Sites de la aplicación, que corresponde al método query. A continuación un fragmento de código del método query:
//Devuelve un id de sitio//content://.../sites/23intsiteId=uri.getPathSegments().get(1);queryBuilder.setTables(favSitesTableMetaData.TABLE_NAME);queryBuilder.appendWhere(favSitesTableMEtaData._ID+"="+siteId);
Como vemos la id del sitio se extrae de la URI. La Uri se divide en segmentos (path) del a forma content://. . . /seg1/seg2/seg3, en nuestro ejemplo el primer segmento es el id 23.
Cláusulas where explícitas
Vamos a ver una vez más la estructura del método managedQuery de la clase Activity:
publicfinalCursormanagedQuery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)
El parámetro selection, es el que actúa como cláusula Where (Representa un filtro en el que elegimos qué filas queremos que se nos devuelvan). Si en este argumento pasamos null se nos devolverán todas las filas para la URI dada. En este parámetro podemos incluir ?, que serán reemplazados por los valores del parámetro selectionArgs en el orden que vayan apareciendo.
Los siguientes códigos que se muestran son equivalentes:
//Método UrimanagedQuery("content://com.elbauldelprogramador.provider.FavSites/sites/23",null,null,null,null);//Método explícitomanagedQuery("content://com.elbauldelprogramador.provider.FavSites/sites",null,"_ID=?",newString[]{23},null);
Te preguntarás qué método usar en según que situación. Por convención se suele usar el método mediate URI cuando sea posible aplicarlo, y el explícito en casos especiales (Como en el ejemplo de arriba.)