Android – Seleccionar máximo en contentProvider

Intento ejecutar esta consulta en mi contenido personalizado.

cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, "max(priority)", null, null, null); 

Para obtener el valor máximo de prioridad int columna.

Yo tambien he intentado

 cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, null, "max(priority)", null, null); 

Sin éxito.

Este código devuelve esta excepción:

  java.lang.IllegalArgumentException: Invalid column MAX(priority) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:523) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:370) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:323) E/DatabaseUtils( 688): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280) E/DatabaseUtils( 688): at nan.salsa.contentprovider.goal.GoalContentProvider.query(GoalContentProvider.java:118) E/DatabaseUtils( 688): at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:150) E/DatabaseUtils( 688): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111) E/DatabaseUtils( 688): at android.os.Binder.execTransact(Binder.java:288) E/DatabaseUtils( 688): at dalvik.system.NativeStart.run(Native Method) D/AndroidRuntime( 727): Shutting down VM 

Implementación de mi proveedor de contenido (Estándar – vea la muestra de notePad)

 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(GoalDescriptor.TABLE_NAME); switch (sUriMatcher.match(uri)) { case GOAL: qb.setProjectionMap(sGoalProjectionMap); qb.appendWhere(GoalDescriptor._ID + "=" + uri.getPathSegments().get(1)); break; case GOALS: qb.setProjectionMap(sGoalProjectionMap); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } // If no sort order is specified use the default String orderBy; if (TextUtils.isEmpty(sortOrder)) { orderBy = GoalInfo.GoalDescriptor.DEFAULT_SORT_ORDER; } else { orderBy = sortOrder; } // Get the database and run the query SQLiteDatabase db = mOpenHelper.getReadableDatabase(); Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy); // Tell the cursor what uri to watch, so it knows when its source data // changes c.setNotificationUri(getContext().getContentResolver(), uri); return c; } 

me puedes ayudar ?

Saludos

3 Solutions collect form web for “Android – Seleccionar máximo en contentProvider”

Usted está enviando el máximo (prioridad) como la proyección, enviarlo como la selección y debe funcionar.

Ver esta pregunta: Android: Obtener el valor más alto en la columna

Editar:

Parece que esto debería funcionar:

 cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, new String[] {"MAX(priority) AS max_priority"}, null, null, null); 

Lamentablemente, la respuesta de nEx (utilizando "AS" para proporcionar un alias para la columna) sólo funciona con proveedores que no establecen el flag strictProjectionMap en su SQLiteQueryBuilder. Por ejemplo, el proveedor de contactos establece este indicador, por lo que si intenta el enfoque AS todavía obtendrá el error "columna no válida".

Y si alguien me puede decir cómo la especificación de una función de agregado como MAX en la selección se supone que funcione estaría muy agradecido. Si lo intento recibo una excepción de "uso indebido de función agregada", que es exactamente lo que esperaría de intentar poner una función agregada en una cláusula WHERE. Sé que usted puede poner una subconsulta en la cláusula WHERE, pero que asume que usted sabe la estructura de la tabla real, y que nunca cambiará en cualquier dispositivo o nivel de OS, que no me gustaría apostar (después de todo, Es por eso que están usando la interfaz del proveedor en primer lugar, para abstraer del almacén de datos subyacente).

Así que … no sé de ninguna manera para hacer esto para los proveedores que establecen la bandera strictProjectionMap que no sea para ordenar DESC por el campo deseado, y preferiblemente limitar a 1 fila si el proveedor lo admite (o si está dispuesto Para arriesgarse a romper algo incluyendo el LÍMITE en la cadena de ordenación). Sería muy feliz si alguien conoce otros enfoques para estos casos!

En mi caso, la respuesta de nEx funcionó, pero me olvidé de añadir también "max_" + COLUMN_NAME dentro del método getColumnIndexByName () del cursor.

Después me di cuenta que esto también tenía que ser cambiado, finalmente funcionó!

  • Cómo ejecutar una consulta con regexp en Android
  • ¿Cómo obtener todos los nombres de tablas en la base de datos Android sqlite?
  • Lectura de transacciones no confirmadas en Android
  • ¿Detectando la transacción olvidada de SQLite en Android usando StrictMode?
  • Los datos guardados se perdieron al reiniciar la aplicación (android)
  • Android: Cómo cargar imagen dinámicamente desde el servidor por su nombre de SQlite
  • Tener varios SQLiteOpenhelper en una aplicación Android
  • Copia de seguridad / restaurar sqlite db en android
  • ¿La reinstalación de la aplicación suprime SQLiteDatabase o SharedPreferences?
  • Determinar el tipo de datos de una columna en SQLite
  • Carácter turco en SQLite mientras utiliza la expresión LIKE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.