Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用内容提供商时如何按分组?_Android_Sql_Group By_Cursor_Android Contentprovider - Fatal编程技术网

Android 使用内容提供商时如何按分组?

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

我已经为我的应用程序创建了一个内容提供商。为了简单起见,我将举一个例子。我有一张“OrderDetails”表格

  • 我有一列用于OrderId
  • 我有一个列,用于显示在该OrderId中购买的不同产品类型的数量
  • 我有一个OrderDetailId,它是表的主键
  • 这是表格:

    我想编写查询:
    选择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");