2016-05-17 94 views
0

我正在創建android應用程序,其中用戶輸入一些收據和日誌。關係是:Receipt has_many日誌。Android - sql查詢group_by項目

這是我的收據和日誌模型。

@Table(name = "Logs") 
public class Logs extends Model { 
    @Column(name="PlateNumber") 
    String plate_number; 
    @Column(name="SortID") 
    String sort_id; 
    @Column(name="Grade") 
    String grade; 
    @Column(name = "Diametar") 
    double diameter; 
    @Column(name="Length") 
    double length; 
    @Column(name="CreatedAt") 
    Date createdAt; 
    @Column(name="Receipt") 
    Receipt receipt; 
    @Column(name = "Price") 
    Price price; 
} 


@Table(name = "Receipt") 
public class Receipt extends Model { 
    @Column(name="Place") 
    String place; 
    @Column(name="ShippingNumber") 
    String shippingNumber; 
    @Column(name="Warehouse") 
    String warehouse; 
    @Column(name="Carrier") 
    String carrier; 
    @Column(name="LicencePlate") 
    String licencePlate; 
    @Column(name = "Driver") 
    String driver; 
    @Column(name = "Customer") 
    String customer; 
    @Column(name= "DestWarehouse") 
    String destWarehouse; 
    @Column(name = "Employee") 
    String employee; 
    @Column(name = "PriceType") 
    String priceType; 
    @Column(name = "PriceCorrection") 
    Double priceCorrection; 
    @Column(name = "PriceCorrection2") 
    Double priceCorrection2; 
    @Column(name = "Supplier") 
    String supplier; 
    @Column(name = "CreatedAt") 
    Date createdAt; 
} 

這是我的活動,我試圖做到這一點,但沒有成功。

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

} 

所以,就我目前所做的是,我通過sortID在此BaseAdapter顯示日誌,但在每個排序顯示它的我的只有最後添加的日誌,它的數據。

現在我需要顯示像它在下面的圖像 - 部分在哪裏REKAPITULAT數據。在那裏我需要通過sortID進行分組,然後在每種分類中我都需要進行分組。

例如,如果我喜歡帶有4個日誌的圖像排序1,每個年級(A,B)2,那麼它需要像圖像一樣顯示它。 enter image description here

我被困在這裏,我會非常感激,如果有人知道如何去做,並願意幫助。

問題:如何創建sql查詢或修復此問題我的代碼顯示數據就像上面的圖像?

+0

你正在使用什麼持久性框架? – JimmyB

+0

'SELECT SortID,Grade,sum(mass),sum(price)FROM ... GROUP BY SortID,Grade' – JimmyB

+0

「mass」是什麼意思?我沒有看到這個名字的任何字段。 – JimmyB

回答

1

下面是一個例子查詢與GROUP BYJOIN使用ActiveAndroid:

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

從這個查詢,你會得到一個Log實例,因此你需要的SUM(Logs.Price)字段映射到一個有效的Log場如Price。例如:

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

該查詢應該適合您的用例。

+0

我是通過sortId和grade進行分組的,但是在每個分組中它只顯示了一個項目。但例如,第3類有2個項目在A級,2個在B級,但只顯示一個。 – RubyDigger19