2017-08-08 87 views
0

我爲我的應用程序提供了一個內容提供程序。爲了簡單起見,我將用一個例子。我有一個'OrderDetails'表。如何在使用Content Provider時進行GROUP BY?

  1. 我有一個OrderId列。
  2. 我有一個在OrderId中購買的不同產品類型數量的列。
  3. 我有一個OrderDetailId是表的主鍵。

下面是表:enter image description here

我想寫查詢:SELECT OrderID, sum(quantity) FROM OrderDetails GROUP BY OrderID這將返回此:enter image description here

不過,我試圖插入我的GROUP BY子句中我的URI爲我內容提供商但它不會工作,所以得到的查詢變成:SELECT OrderID, sum(quantity) FROM OrderDetails,返回此(所有內容和最後OrderId的整個數量):enter image description here

這裏是獲取光標,只需打印出結果,我剛纔提出:

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); 
    } 
} 

,只打印出所有訂單的全部資金,與過去的ID,這是在桌子上。

我相信GROUP BY已被刪除,不再支持。有沒有其他方法可以提供相同的結果?

謝謝

+0

你怎麼看如果輸出名爲selection的變量? –

回答

0

我已經做了內容供應商對於我的應用程序

除非你計劃有幾個應用程序都使用這個數據,我不建議實施ContentProvider

我相信GROUP BY取出並不再支持

ContentProvider/ContentResolver協議不支持SQL一般,更不用說GROUP BY。畢竟,不要求使用SQL數據庫實現ContentProvider

有沒有其他方法可以提供相同的結果?

ContentProvider上執行GROUP BY,而不是在客戶端上。 IOW,就像使用REST風格的Web服務一樣處理它,它是實現SQL的Web服務(而不是Web服務的客戶端)。

例如,如果用/foo路徑的Uri處理基本的查詢,/foo/summary有可能實現的SUMGROUP BY位。

我試圖插入我的GROUP BY子句中我的URI爲我的內容提供商,但它不會工作

因爲我們沒有你ContentProvider實施,我們真的不能對此發表評論。但是,請注意,GROUP BY不是你回來的東西,所以把它放在投影中將是一個非典型的選擇。

0

回答我自己的問題:

有#2的答案在那裏 - Android: Distinct and GroupBy in ContentResolver 因爲一些思想已經投入的答覆,我將離開這個問題了。

雖然我覺得,正如其他答案所述,這應該在內容提供者本身中進行排序。然而,有速戰速決,當你在呼喚你的內容供應商可得:

在您的投影字符串,你可以簡單地添加...

String projection = COLUMN_NAME + "'a_condition' GROUP BY " + COLUMN_NAME" 

希望這有助於