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ó!

  • SQLiteOpenHelper - crear base de datos en tarjeta SD
  • Guardar ArrayLists en bases de datos SQLite
  • Comprueba si la consulta ha tenido éxito en sqlite para Android
  • BeginTransaction (), endTransaction () y setTransactionSuccessful (). ¿Qué hacen exactamente?
  • Base de datos onUpgrade - oldVersion - newVersion
  • SQLite - insertar una cadena con nuevas líneas en la base de datos desde el archivo csv
  • Cómo reemplazar el archivo de base de datos sqlite existente con un nuevo archivo de base de datos en android
  • Actualizar ListView después de eliminar la operación
  • SQLiteDatabase.openDatabase vs SQLiteOpenHelper.getReadableDatabase
  • Preguntas sobre el uso de Android Backup Service con una base de datos SQLite
  • Compare las fechas (almacenadas como cadena) en la base de datos android sqlite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.