2017-08-08 3 views
0

J'ai créé un fournisseur de contenu pour mon application. Pour simplifier, je vais utiliser un exemple. J'ai une table 'OrderDetails'.Comment GROUPER lorsque vous utilisez un fournisseur de contenu?

  1. J'ai une colonne pour l'ID de commande.
  2. J'ai une colonne pour la quantité des différents types de produits qui ont été achetés dans cet OrderId.
  3. J'ai un OrderDetailId qui est la clé primaire de la table.

Voici le tableau: enter image description here

Je veux écrire la requête: SELECT OrderID, sum(quantity) FROM OrderDetails GROUP BY OrderID qui renverrait ceci: enter image description here

Cependant, j'ai essayé d'insérer mon clause GROUP BY dans mon URI pour mon Content Provider mais cela ne fonctionnera pas, donc la requête résultante devient: SELECT OrderID, sum(quantity) FROM OrderDetails qui renvoie ceci (la quantité entière de tout et le dernier OrderId): enter image description here

Voici la méthode pour obtenir le curseur et il suffit d'imprimer le résultat que je viens de faire:

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

Il n'imprime la totalité de la somme de toutes les commandes, le dernier ID qui était sur la table.

Je crois que GROUP BY a été supprimé et n'est plus supporté. Y a-t-il un autre moyen qui produira le même résultat?

Merci

+0

qu'est-ce que vous voyez si vous produisez la variable nommée selection? –

Répondre

0

J'ai fait un fournisseur de contenu pour mon application

À moins que vous prévoyez d'avoir plusieurs applications utilisent toutes ces données, je ne recommande pas la mise en œuvre d'un ContentProvider.

Je crois que GROUP BY a été enlevé et pas plus pris en charge

Le protocole ContentProvider/ContentResolver ne prend pas en charge SQL en général, et encore moins GROUP BY. Après tout, il n'est pas nécessaire qu'un ContentProvider soit implémenté en utilisant une base de données SQL.

Y a-t-il un autre moyen de fournir le même résultat?

Implémentez le GROUP BY sur le ContentProvider, pas sur le client. IOW, gérer cela de la même manière que vous le feriez avec un service Web de style REST, où c'est le service Web, et non le client du service Web, qui implémente le SQL.

Par exemple, si un Uri avec un chemin de /foo poignées des requêtes de base, /foo/summary pourrait mettre en œuvre les SUM et GROUP BY morceaux.

J'ai essayé d'insérer mon clause GROUP BY dans mon URI pour mon fournisseur de contenu, mais il ne fonctionnera pas

Puisque nous n'avons pas votre implémentation ContentProvider, nous ne pouvons pas vraiment dire à ce sujet. Cependant, veuillez noter que GROUP BY n'est pas quelque chose que vous retournez, et donc le mettre dans la projection serait un choix atypique.

0

réponse à ma propre question:

Il y a des réponses là-bas sur Stackoverflow - Android: Distinct and GroupBy in ContentResolver Je vais laisser cette question parce que une réflexion a été mis dans les réponses. Bien que je pense que, comme décrit dans d'autres réponses, cela devrait être trié dans le fournisseur de contenu lui-même. Cependant, il y a une solution rapide à avoir lorsque vous appelez votre fournisseur de contenu:

dans votre chaîne de projection, vous pouvez simplement ajouter ...

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

Hope this helps