2016-05-17 4 views
0

Ich erstelle Android-App, wo Benutzer einige Quittungen und Protokolle eingibt. Beziehung ist: Empfang has_many Logs.Android - SQL-Abfrage für group_by Artikel

Hier sind mein Beleg und Protokoll-Modell.

Hier ist meine Tätigkeit, wo ich versuche, dies aber erfolglos zu erreichen.

public class LogsRecapitulation extends AppCompatActivity { 

    private ListView mainListView; 
    private BaseAdapter listAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_listview); 
     mainListView = (ListView) findViewById(R.id.ListViewItem); 

     //recieve RecepitID in displayLogs.activity 
     final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); 
     List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID").execute(); // I grouped Logs by sortId in this line. 

     listAdapter = new RecapitulationArrayAdapter(logsList); 
     mainListView.setAdapter(listAdapter); 
    } 

    private class RecapitulationArrayAdapter extends BaseAdapter { 
     private LayoutInflater inflater; 
     private List<Logs> logsList; 

     public RecapitulationArrayAdapter(List<Logs> logsList) { 
      inflater = LayoutInflater.from(LogsRecapitulation.this); 
      this.logsList = logsList; 
     } 

     @Override 
     public int getCount() { 
      return logsList.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return logsList.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return logsList.get(position).getId(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.logs_recapitulation, parent, false); 
      } 
      Logs log = logsList.get(position); 
      ((TextView) convertView.findViewById(R.id.rec_log_sort)).setText(log.sort_id); 
      ((TextView) convertView.findViewById(R.id.rec_log_class)).setText(log.grade); 
      ((TextView) convertView.findViewById(R.id.rec_log_count)).setText(String.valueOf(logsList.size())); 
      ((TextView) convertView.findViewById(R.id.rec_logs_mass)).setText(String.format("%.2f m3", log.getM3())); 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.stumpPrice_kn)); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_log_price_default)).setText(String.valueOf(log.price.roadPrice_kn)); 
      } 

      if (log.receipt.priceType.equals("Na panju")) { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.stumpPrice_kn * log.getM3())); 
      } else { 
       ((TextView) convertView.findViewById(R.id.rec_calculated_price)).setText(String.format("%.2f KN", log.price.roadPrice_kn * log.getM3())); 
      } 

      return convertView; 
     } 
    } 

} 

Also, was ich bisher getan ist, dass ich Anzeige von Protokollen von SortID in diesem BaseAdapter, aber in jeder Art ist es mir zeigen nur letzte Protokoll hinzugefügt und es ist Daten.

Jetzt muss ich Daten anzeigen, wie es auf Bild unten ist - Teil wo REKAPITULAT ist. Dort brauche ich eine Gruppierung nach Sortier-ID und dann muss ich sie in jeder Gruppe nach Klassen gruppieren.

Zum Beispiel wenn ich wie auf Bild sortiere 1 mit 4 Protokollen, 2 jeder Klasse (A, B) dann muss es wie auf Bild anzuzeigen. enter image description here

Ich bin hier fest und ich wäre sehr dankbar, wenn jemand weiß, wie es geht und ist bereit zu helfen.

Frage: Wie sql Abfrage erstellen oder meinen Code zu beheben, um Daten anzuzeigen, wie es auf Bild oben ist?

+0

Welchen Persistenz-Framework verwenden Sie? – JimmyB

+0

'SELECT SortierungID, Note, Summe (Masse), Summe (Preis) VON ... GROUP BY SortID, Grad' – JimmyB

+0

Was meinst du mit" Masse "? Ich sehe kein Feld mit diesem Namen. – JimmyB

Antwort

1

Hier ist ein Beispiel Abfrage mit GROUP BY und JOIN mit ActiveAndroid:

new Select("SUM(Logs.Price)") 
    .from(Logs.class) 
    .join(Receipt.class) 
    .on("Receipt.Id = Logs.Receipt") 
    .groupBy("Logs.sortID") 
    .execute(); 

Von dieser Abfrage werden Sie eine Log Instanz erhalten, so dass Sie das SUM(Logs.Price) Feld auf ein gültiges Log Feld abzubilden müssen wie Price. Zum Beispiel:

new Select("SUM(Logs.Price) AS Logs.Price") 

Die Abfrage sollte für Ihren Anwendungsfall angepasst werden.

+0

Ich habe die Gruppe nach Sortierung und Sortierung gruppiert, aber in jeder Gruppe zeige ich nur einen Eintrag. Aber zum Beispiel hat Klasse 3 2 Punkte in Klasse A und 2 Punkte in Klasse B, aber es zeigt nur einen. – RubyDigger19