在循环遍历所有行时更新列

时间:2014-04-01 13:18:21

标签: java android sqlite sql-update

我希望每行更新1列,因为我遍历了所有这些行。我有一些东西,但我知道它不正确。只有在永远不会删除记录并添加新记录时,它才会起作用。它遇到问题的地方是如果一行被删除而且_id不再存在,它将尝试更新该行,因为它只是循环通过“键”并在最后执行“key ++”。

public void updateMPG(){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = getWritableDatabase().rawQuery("select (x.odometer - y.odometer) / x.gallons as mpg from gasLog x, gasLog y where y.odometer = (select max(z.odometer) from gasLog z where z.odometer < x.odometer)", null);
        Cursor cursor2 = getReadableDatabase().rawQuery("SELECT odometer FROM gasLog", null);
        ContentValues values = new ContentValues();
        try {
            cursor.moveToFirst();
            cursor2.moveToFirst();
            int key = 1;
            while (true) {
                if (cursor.getCount() > 0 && (cursor2.getString(0) != getOdometerReading())){
                    mpg = cursor.getString(0);
                    values.put(KEY_MPG, mpg);
                    db.update(TABLE_GASLOG, values, "_id=?", new String[]{String.valueOf(key)});
                } else {
                    values.put(KEY_MPG, 0);
                    db.update(TABLE_GASLOG, values, "_id=?", new String[]{String.valueOf(key)});
                }

                if (cursor.isLast())
                    break;
                cursor.moveToNext();
                cursor2.moveToNext();
                key++;
            }
        } finally {
            cursor.close();
        }
        db.close();

    }

如您所见,它将循环遍历行1,2,3,4,5,6等...但是如果删除记录(比如第3行)并创建新行..行7,它永远不会到达第7行。它只会循环通过1,2,3(不再存在),4,5,6 ..

任何人都知道如何更新光标所在的当前行?

如果您需要任何其他详细信息,请告知我们。

由于

编辑:删除代码

public void deleteGasLog(long id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_GASLOG, //table name
                KEY_ID + " = ?",  // selections
                new String[] { String.valueOf(id) }); //selections args
        db.close();

    }

2 个答案:

答案 0 :(得分:0)

您只需将_id列添加到查询中,以便可以读取当前行的正确值。

但是,以下语句将一次更新所有mpg值:

UPDATE gasLog
SET mpg = COALESCE((odometer - (SELECT odometer
                                FROM gasLog AS G2
                                WHERE odometer < gasLog.odometer
                                ORDER BY odometer DESC
                                LIMIT 1)) / gallons,
                   0)

答案 1 :(得分:-1)

从查询中检索游标后,除了表示db的数据外,它与实际数据库无关。即使您能够更改光标中的行(您无法更改),也不会影响数据库。