Android 使用内容提供商时如何按分组?
我已经为我的应用程序创建了一个内容提供商。为了简单起见,我将举一个例子。我有一张“OrderDetails”表格Android 使用内容提供商时如何按分组?,android,sql,group-by,cursor,android-contentprovider,Android,Sql,Group By,Cursor,Android Contentprovider,我已经为我的应用程序创建了一个内容提供商。为了简单起见,我将举一个例子。我有一张“OrderDetails”表格 我有一列用于OrderId 我有一个列,用于显示在该OrderId中购买的不同产品类型的数量 我有一个OrderDetailId,它是表的主键 这是表格: 我想编写查询:选择OrderID,按OrderID从OrderDetails组中求和(数量),它将返回以下内容: 但是,我已尝试在我的内容提供商的URI中插入我的GROUP BY子句,但它不起作用,因此生成的查询变成:SELECT
选择OrderID,按OrderID从OrderDetails组中求和(数量)
,它将返回以下内容:
但是,我已尝试在我的内容提供商的URI中插入我的GROUP BY子句,但它不起作用,因此生成的查询变成:SELECT OrderID,sum(quantity)FROM OrderDetails
,返回此值(所有内容的全部数量和最后一个OrderID):
下面是获取光标并简单打印出我刚才生成的结果的方法:
private void findQuantityByOrder(){
Uri uri = DatabaseContract.CONTENT_URI_ORDER_DETAILS;
String[] selection = new String[] {DatabaseContract.DatabaseOrderDetails.ORDER_ID,
"sum("+ DatabaseContract.DatabaseOrderDetails.QUANTITY + ")"
+"GROUP BY(" + DatabaseContract.DatabaseOrderDetails.ORDER_ID + ")"};
String projection = null;
String sortBy = null;
String[] args = null;
Cursor cursor = getContentResolver().query(
uri,
selection,
projection,
args,
sortBy);
for (int i = 0; i < cursor.getCount(); i ++) {
cursor.moveToPosition(i);
int orderID = cursor.getInt(cursor.getColumnIndex("orderID"));
int quantity = cursor.getInt(cursor.getColumnIndex("sum(quantity)"));
System.out.println("orderId: " + orderID + ". Quanitity: " + quantity);
}
}
private void findQuantityByOrder(){
Uri=DatabaseContract.CONTENT\u Uri\u ORDER\u DETAILS;
字符串[]选择=新字符串[]{DatabaseContract.DatabaseOrderDetails.ORDER\u ID,
总和(“+DatabaseContract.DatabaseOrderDetails.QUANTITY+”)
+“分组依据(“+DatabaseContract.DatabaseOrderDetails.ORDER\u ID+”)”;
字符串投影=空;
字符串sortBy=null;
字符串[]args=null;
Cursor Cursor=getContentResolver().query(
乌里,
选择,
投影,
args,
肮脏的);
对于(int i=0;i
它只打印出所有订单的总和,以及表上的最后一个ID
我认为,该团体已被删除,不再得到支持。有没有其他方法可以提供相同的结果
多谢各位
我已经为我的应用程序创建了一个内容提供商
除非您计划让多个应用程序都使用这些数据,否则我不建议实现ContentProvider
我认为,该团体已被删除,不再得到支持
ContentProvider
/ContentResolver
协议通常不支持SQL,更不用说groupby
。毕竟,不需要使用SQL数据库实现ContentProvider
有没有其他方法可以提供相同的结果
在ContentProvider
上实施分组方式,而不是在客户端。请注意,处理这个问题的方法与使用REST样式的Web服务相同,其中实现SQL的是Web服务,而不是Web服务的客户机
例如,如果路径为/foo
的Uri
处理基本查询,/foo/summary
可能实现求和
和按
位分组
我已尝试在我的URI中为我的内容提供商插入我的GROUPBY子句,但它无法工作
由于我们没有您的ContentProvider
实现,因此我们无法对此发表评论。但是,请注意,groupby
不是您返回的内容,因此将其放入投影将是一个非典型的选择
我已经为我的应用程序创建了一个内容提供商
除非您计划让多个应用程序都使用这些数据,否则我不建议实现ContentProvider
我认为,该团体已被删除,不再得到支持
ContentProvider
/ContentResolver
协议通常不支持SQL,更不用说groupby
。毕竟,不需要使用SQL数据库实现ContentProvider
有没有其他方法可以提供相同的结果
在ContentProvider
上实施分组方式,而不是在客户端。请注意,处理这个问题的方法与使用REST样式的Web服务相同,其中实现SQL的是Web服务,而不是Web服务的客户机
例如,如果路径为/foo
的Uri
处理基本查询,/foo/summary
可能实现求和
和按
位分组
我已尝试在我的URI中为我的内容提供商插入我的GROUPBY子句,但它无法工作
由于我们没有您的ContentProvider
实现,因此我们无法对此发表评论。但是,请注意,groupby
不是您返回的内容,因此将其放入投影中将是一个非典型的选择。回答我自己的问题:
在Stackoverflow上有答案-
我将把这个问题留待讨论,因为在回答中已经考虑了一些问题
虽然我觉得,如其他答案所述,这应该在内容提供商本身中进行排序。但是,当您致电内容提供商时,有一个快速解决方案:
在投影字符串中,您可以简单地添加
String projection = COLUMN_NAME + "'a_condition' GROUP BY " + COLUMN_NAME"
希望这有助于回答我自己的问题:
在Stackoverflow上有答案-
我将把这个问题留待讨论,因为在回答中已经考虑了一些问题
虽然我觉得,如其他答案所述,这应该在内容提供商本身中进行排序。但是,当您致电内容提供商时,有一个快速解决方案:
在投影字符串中,您可以简单地添加
String projection = COLUMN_NAME + "'a_condition' GROUP BY " + COLUMN_NAME"
希望这会有所帮助不确定您是否仍在寻找答案,但是,内容提供商对groupby
的一个攻击是将groupby
子句作为查询参数嵌入URI
private void findQuantityByOrder(){
Uri uri = DatabaseContract.CONTENT_URI_ORDER_DETAILS + "?groupBy=" + DatabaseContract.DatabaseOrderDetails.ORDER_ID;
String[] projection = new String[] {DatabaseContract.DatabaseOrderDetails.ORDER_ID,
"sum("+ DatabaseContract.DatabaseOrderDetails.QUANTITY + ")"};
String selection = null;
String sortBy = null;
String[] args = null;
Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
args,
sortBy);
for (int i = 0; i < cursor.getCount(); i ++) {
cursor.moveToPosition(i);
int orderID = cursor.getInt(cursor.getColumnIndex("orderID"));
int quantity = cursor.getInt(cursor.getColumnIndex("sum(quantity)"));
System.out.println("orderId: " + orderID + ". Quanitity: " + quantity);
}
}
String groupBy = uri.getQueryParameter("groupBy");