我希望每行更新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();
}
答案 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的数据外,它与实际数据库无关。即使您能够更改光标中的行(您无法更改),也不会影响数据库。