执行rawQuery并为数据库中的每一行放置结果值

时间:2014-03-13 18:45:54

标签: java android database sqlite

所以目前在添加到我的数据库时,我执行这个select语句获取结果并将其添加到我的数据库中的一个单独的列中,它看起来如下:

public void addGasLog(GasLog gasLog){
        // Get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // Create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        //...

        Cursor cursor = getWritableDatabase().rawQuery("select (" + gasLog.getOdometer() + " - y.odometer) / " + gasLog.getGallons() + " as mpg from gasLog x, gasLog y where y.odometer = (select max(z.odometer) from gasLog z where z.odometer < " + gasLog.getOdometer() + ")", null);
        try {
              if (cursor.moveToFirst()) { 
                  mpg = cursor.getString(0);
              }
            } finally {
              cursor.close();
            }
        values.put(KEY_MPG, mpg);

        Log.d("MySQLiteHelper", KEY_MPG);

        // Insert
        long gasLog_id = db.insert(TABLE_GASLOG, //table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values =


        db.close();
}

所以这很好,它在select语句中执行我需要的计算,并在该行的mpg列中插入正确的值。

我需要的是能够使用这个类似的功能,并在数据库中的每一行上执行它...所以在每一行上运行该select语句,并将值传递给它命中的每一行的mpg列

我知道有些值会发生变化,例如gasLog.getOdometer()需要获取该行的“里程表”列的值,gasLog.getGallons()需要是“加仑”的值该行的列。

任何帮助将不胜感激。

编辑:我希望将这个问题的结果放入一个我可以单独运行的新方法中,该方法将遍历数据库中的每一行并更新它们。

EDIT2:

这是我创建的方法,现在正在创建空白列

public void updateMPG(){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = getWritableDatabase().rawQuery("select ('odometer' - y.odometer) / 'gallons' as mpg from gasLog x, gasLog y where y.odometer = (select max(z.odometer) from gasLog z where z.odometer < 'odometer')", null);
        ContentValues values = new ContentValues();
        try {
            cursor.moveToFirst();
            while (true) {
                mpg = cursor.getString(0);
                values.put(KEY_MPG, mpg);
                long gasLog_id = db.insert(TABLE_GASLOG, null, values);
                if (cursor.isLast())
                    break;
                cursor.moveToNext();
            }
        } finally {
            cursor.close();
        }
        db.close();

    }

EDIT3: database

1 个答案:

答案 0 :(得分:1)

以下是如何遍历数据库中的所有行并修改TABLE_GASLOG表中的mpg列值。

Cursor cursor = getWritableDatabase().rawQuery("select (" + gasLog.getOdometer() + " - y.odometer) / " + gasLog.getGallons() + " as mpg from gasLog x, gasLog y where y.odometer = (select max(z.odometer) from gasLog z where z.odometer < " + gasLog.getOdometer() + ")", null);
try {
    cursor.moveToFirst();
    int key = 1;
    while (true) {
        mpg = cursor.getString(0);
        values.put(KEY_MPG, mpg);
        db.update(TABLE_GASLOG, values, "_id=?", new String[]{String.valueOf(key)});
        if (cursor.isLast())
            break;
        cursor.moveToNext();
        key++;
    }
} finally {
    cursor.close();
}
db.close();

此代码将基本遍历整个结果集,然后在每行中提取mpg值并将其插入TABLE_GASLOG数据库。

编辑:这将向TABLE_GASLOG添加更多行。从您发表评论,我了解您需要更新您的行。在这种情况下,请使用:

而不是db.insert()方法
update(String table, ContentValues values, String whereClause, String[] whereArgs)

你的where子句将取决于你的条件。