2016-05-17 96 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