一尘不染

android根据当前列值更新数据库列

sql

在android中,SQLiteDatabase具有更新功能

update(String table, ContentValues values, String whereClause, String[] whereArgs)

放入新值values
如果要通过向列A中添加列来更新列A,应如何准备ContentValues values变量?我认为以下方法无效。

cv.put("A", "A" + 1);

我可以确定execSQL使用原始sql运行,但是它不返回更新的行数


阅读 148

收藏
2021-03-17

共1个答案

一尘不染

如果要执行原始查询,则应执行以下类似操作以增加列中的当前值:

UPDATE table_name SET column_a = column_a + 1 WHERE _id = 1

(这里1仅是一个示例,以说明如何将其应用于特定的行)

可能无法使用相同的功能ContentValues,因为(如名称所示)它需要使用将列设置为的值。这意味着在构建之前需要先对其进行评估ContentValues,而对于原始查询,只有在查询实际在数据库上运行后,该值才会被评估。

当然,您可以先获取当前值,然后在发布更新时相应地增加该值。首先需要选择查询。不过,通常是在Java中使用对象,其中行的列值绑定到对象的成员字段。如果您具有这样的设置,则您可能要运行更新查询时已经具有当前值。

这样,它看起来就像:

SomeObject object = ...;
cv.put("column_a", object.getSomeValue() + 1);

(我假设object.getSomeValue()将返回int


//编辑:这是原始查询方法的更多示例:


// edit2:您已经编辑了原始问题并添加了:

我可以确定execSQL使用原始sql运行,但是它不返回更新的行数

如果必须知道 更改查询的行数,则可以潜在地利用该changes()功能。尽管如此,这仍然意味着您将不得不运行第二个查询。

SELECT changes() FROM table_name

文档说:

changes()函数返回由最近完成的INSERT,DELETE或UPDATE语句更改,插入或删除的数据库行数,不包括低级触发器中的语句。changes()SQL函数是sqlite3_changes()C
/ C ++函数的包装,因此遵循相同的计数变化规则。

另外,您可以调查rawQuery()采用SQL语句并以形式返回结果的方法Cursor。不知道它是否甚至可以用于更新查询,或者不确定结果是否有意义,但是如果您真的很幸运,您可能会发现它Cursor.getCount()为您带来了受影响的行数。

2021-03-17