【问题标题】:Making calculation from SQLite从 SQLite 进行计算
【发布时间】:2018-03-26 10:54:55
【问题描述】:

我正在尝试创建两个 SQLite 表,一个用于输入数据,另一个用于检索计算数据。

首先我想让客户端输入一些真实的数据,然后在后台计算并将新数据放到textview中。

目前,我尝试从一张表中检索它。

    @Override
public void onCreate(SQLiteDatabase db) {


    String sSQL;

    sSQL = "CREATE TABLE " + DataContract.TABLE_NAME +
            "(" +
            DataContract.Columns._ID + " INTEGER PRIMARY KEY NOT NULL, " +
            DataContract.Columns.PRODUCT_NAME + " TEXT, " +
            DataContract.Columns.PRODUCT_WIDTH + " REAL, " +
            DataContract.Columns.PRODUCT_LENGHT+ " REAL, " +
            DataContract.Columns.PRODUCT_PRICE+ " REAL, " +


   //This is the data I want to calculate and put to a textview in a 
   //new intent

   DataContract.Columns.PRODUCT_TOTAL_PRICE + " REAL)"; 




    Log.d(TAG,sSQL);

    db.execSQL(sSQL);



}

我有一个 Serializable 类,我试图计算这个类中的数据。

private final String ProductName;
private final double ProductLenght;
private final double ProductWidth;
private final double ProductPrice;
private final double ProductTotalPrice;

然后我尝试用getter方法计算数据。

public double getProductTotalPrice() {

    return (getProductWidth() * getProductLenght() * getProductPrice())/1000;

}

但是,我不知道如何将检索到的计算数据放回文本视图。

我应该创建两张表还是一张表就足够了?

还有什么是在 Java 代码中计算数据并将其放回列的最简单方法?

谢谢!

【问题讨论】:

    标签: java android sqlite calculated-columns calculation


    【解决方案1】:

    还有什么是在 Java 代码中计算数据的最简单方法 并将其放回一列?

    什么都不做(即在提取数据时计算值,减少存储在数据库中的数据量)

    为计算值添加另一列将是一种浪费,因为您可以在提取数据(到光标中)时计算值,例如:-

    假设表(称为 myproducts)填充如下(注意没有 PRODUCT_TOTAL_PRICE 列,因为它不需要):-

    然后使用查询提取它:-

    SELECT 
        _ID,
        PRODUCT_NAME, 
        PRODUCT_WIDTH, 
        PRODUCT_LENGTH, 
        PRODUCT_PRICE, 
        (PRODUCT_WIDTH * PRODUCT_LENGTH * PRODUCT_PRICE)/1000 AS CALCULATED_TOTAL_PRICE
    FROM myproducts;
    

    将导致:-

    您可以在数据库助手中有一个方法,例如:-

        public double Cursor getTotalpriceBtId(long id) {
            double rv = 0;
            String column_name = "totalprice";
            String calculation = "(" +
                DataContract.Columns.PRODUCT_WIDTH + " * " +
                DataContract.Columns.PRODUCT_LENGHT + " * " +
                DataContract.Columns.PRODUCT_PRICE + ")/1000";
            String[] columns = new String[]{calculation + " AS " + column_name};
            String whereclause = DataContract.Columns._ID + "=?";
            String[] whereargs = new String[]{String.valueOf(id)};
            Cursor csr = this.getWritableDatabase().query(
                DataContract.TABLE_NAME,
                columns,
                whereclause,
                whereargs,
                null,null,null
            );
            if (csr.moveToFirst) {
                rv = csr.getDouble(csr.getColumnIndex(column_name));
            }
            csr.close();
            return rv;
        }
    
    • 底层 SQL 与上面的示例类似。但是,只需要一列。

    但是,我不知道如何将检索到的计算数据放回 文本视图。

    类似于:-

    yourTextView.setText(String.valueOf(yourDBHelperInstance.getTotalpriceBtId(ID_OF_THE PRODUCT)));

    或者也许:-

    yourTextView.setText(String.valueOf(yourproduct.getProductTotalPrice()));
    

    【讨论】:

    • 太棒了。但是这个:(PRODUCT_WIDTH * PRODUCT_LENGTH * PRODUCT_PRICE) * .001 AS CALCULATED_TOTAL_PRICE 会稍微快一些(因为乘法比除法快)。所以乘以预先计算的倒数会更快。
    【解决方案2】:

    无需创建两个表 将值插入表后,您只需通过以下查询创建一个函数

    从 yourtablename 中选择 sum(your column name) where 条件是您过滤数据的基础。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多