Android-在contentProvider中选择max

Android-在contentProvider中选择max,android,sqlite,select,max,android-contentprovider,Android,Sqlite,Select,Max,Android Contentprovider,我尝试在自定义contentprovider上运行此查询 cursor = activity.getContentResolver().query( GoalDescriptor.CONTENT_URI, "max(priority)", null, null, null); 获取优先级int列的最大值 我也试过: cursor = activity.getContentResolver().que

我尝试在自定义contentprovider上运行此查询

cursor = activity.getContentResolver().query(
                GoalDescriptor.CONTENT_URI,
                "max(priority)", null,
                null, null);
获取优先级int列的最大值

我也试过:

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

此代码返回此异常:

    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
我的内容提供商实现(标准-参见记事本示例)

你能帮我吗

将最大值(优先级)作为投影发送,将其作为选择发送,它应该可以工作

见这个问题:

编辑:

看来这应该行得通:

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

不幸的是,nEx的答案(使用“AS”为列提供别名)只适用于没有在SQLiteQueryBuilder中设置strictProjectionMap标志的提供者。例如,联系人提供程序设置此标志,因此,如果您尝试AS方法,您仍然会收到“无效列”错误

如果有人能告诉我在选择中指定像MAX这样的聚合函数应该如何工作,我将非常感激。如果我尝试它,我只会得到一个“滥用聚合函数”异常,这正是我在WHERE子句中尝试放置聚合函数所期望的。我知道可以将子查询放在WHERE子句中,但前提是您知道实际的表结构,并且它在任何给定的设备或操作系统级别上都不会更改,这是我不想打赌的(毕竟,这就是为什么我们首先使用提供程序接口,从底层数据存储中抽象出来的原因)


因此,对于设置strictProjectionMap标志的提供者,除了按所需字段对DESC进行排序外,我不知道有什么方法可以做到这一点,如果提供者支持,最好将DESC限制为1行(或者如果您愿意冒险在排序字符串中包含此限制)。如果有人知道这些案例的其他方法,我将非常高兴

在我的例子中,nEx的答案实际上是有效的,但我忘了在游标的getColumnIndexByName()方法中添加“max_uu”+COLUMN_NAME


当我发现这也必须改变后,它终于起作用了

ContentProvider实现如何处理查询?当它进入数据库时,可能没有正确地翻译它?我已经用我的内容提供商查询实现更新了我的帖子。。。。我的代码在标准查询和crud操作上运行得很好。Android似乎只需要为列设置一个名称。这种语法在MyTouch OS 2.1(不知道SQLite的版本)上对我有效,但在我的G2上失败了:(
cursor = activity.getContentResolver().query(
         GoalDescriptor.CONTENT_URI,
          new String[] {"MAX(priority) AS max_priority"}, null,
         null, null);