【问题标题】:Search SQLite Database and use values from retrieved rows for calculation搜索 SQLite 数据库并使用检索到的行中的值进行计算
【发布时间】:2014-02-06 21:16:37
【问题描述】:

我尝试搜索此内容,但可能搜索不正确。

这是一个安卓应用程序。 本质上,我想根据一些标准(例如子类别和项目名称)搜索数据库,然后使用行中的一些其他数据值进行计算(例如获取价格值,并将其用于计算)

我认为它类似于这个查询..

Cursor d = db.rawQuery("SELECT * FROM prices WHERE subcat = 'meat'  AND  item = 'lamb' ")

现在我需要检索一列(如价格)并使用这些值来计算平均价格之类的东西。我该怎么做? (假设第 1 步是正确的)...

【问题讨论】:

标签: android sql sqlite search calculated-columns


【解决方案1】:

您可以使用aggregate functions 根据多条记录中的列值计算单个值:

SELECT AVG(price) FROM prices WHERE subcat = 'meat' AND item = 'lamb'

【讨论】:

  • 我也可以将算术表达式直接写入sql语句吗?对吧?
【解决方案2】:

创建光标后,获取要读取的列的索引。例如,如果 SELECT * 返回的列之一是价格,则以下给出该列在每个游标行中的位置:

int PRICE_INDEX = d.getColumnIndexOrThrow("price");

然后你需要遍历结果集。对于每一行,使用适当的“get”方法来提取值。这里我假设 price 是数据库上的 INTEGER,因此 getInt():

while (d.moveToNext())
{
    int price = d.getInt(PRICE_INDEX);
    //Do whatever calculation you need with price here, or add to an array to process later
}

完成后记得关闭光标:

d.close();

如果您可以在 SQL 中进行计算,那么 CL 的答案会更好。在这种情况下,只返回一行,因此不需要循环 - 只需使用 d.MoveToFirst(),然后使用 d.getInt(0)。您可以安全地执行 getInt(0),因为您只返回 SELECT 中的一列。

【讨论】:

    【解决方案3】:

    为你的产品创建一个类

    Class AnimalProduct{
     Sting cat, subcat, item;
     int price;}
    

    然后在您的数据库中运行查询(我假设您有列 cat、subcat、item、price) 根据您的标准说 items = "lamb"

    public ArrayList<AnimalProduct> getItem(String item) 
    {
    
        ArrayList<AnimalProduct> aps = new ArrayList<AnimalProduct>();
        SQLiteDatabase db = this.getReadableDatabase();
    
        Cursor cursor = db.query(YOURTABLE, 
                KEY_CAT, KEY_SUBCAT, KEY_ITEM, KEY_PRICE, 
                KEY_ITEM + " = ?" , new String[] {item }, 
                null, null, null, null);
    
        if (cursor.moveToFirst()) 
        {
            cursor.moveToLast();
            do {                
                AnimalProduct t = new AnimalProduct();
    
                t.cat       = cursor.getString(0);
                t.subcat    = cursor.getString(1);
                t.item   = cursor.getString(2);
                t.price = Integer.parseInt(cursor.getString(3));
    
                tList.add(t);
            } while (cursor.moveToPrevious());
        }
    
        cursor.close();
        db.close();         
        return aps; 
    }
    

    一旦您在代码中获得此列表,您就可以轻松地进行所需的任何计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多