在android中,SQLiteDatabase
具有更新功能
update(String table, ContentValues values, String whereClause, String[] whereArgs)
values
中的新值
如果我想通过添加一列来更新列A,我应该如何准备ContentValues值变量?我不认为以下内容可行。
cv.put("A", "A" + 1);
我可以肯定用原始sql运行execSQL
,但它不会返回更新的行数
答案 0 :(得分:3)
如果你执行一个原始查询,这样的东西应该可以增加列中的当前值:
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:您已编辑原始问题并添加了:
我可以确定使用原始sql运行
execSQL
,但它不会返回num 行更新
如果知道查询更改了多少行是必须,那么您可以利用changes()
函数。它仍然意味着你将不得不运行第二个查询。
SELECT changes() FROM table_name
文档说:
changes()函数返回的数据库行数 最近完成的INSERT更改,插入或删除, DELETE或UPDATE语句,不包括较低级别的语句 触发。 changes()SQL函数是一个包装器 sqlite3_changes()C / C ++函数因此遵循相同的规则 计算变化。
或者,您可以查看采用SQL语句的rawQuery()
方法,并将结果作为Cursor
返回。不确定它是否适用于更新查询,或者结果是否合理,但如果您真的很幸运,您可能会发现Cursor.getCount()
会为您提供受影响的行数。
答案 1 :(得分:2)
为了扩展@ MH的解决方案,实际上有一种方法可以进行原始更新并获取更新的行数(因为我在我的一个项目中做了同样的事情)。您必须使用已编译的SQLiteStatement
,然后调用方法executeUpdateDelete()
。来自文档:
public int executeUpdateDelete ()
如果受执行此SQL语句影响的行数对调用者有任何重要性,则执行此SQL语句 - 例如,UPDATE / DELETE SQL语句。
<强>返回强>
受此SQL语句执行影响的行数。
请参阅以下示例代码,其中我向表中添加了一个新列,然后按照您的要求更新每个列:
db.beginTransaction();
try {
db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN "
+ COLUMN_NAME_LOCALTIME + " INTEGER");
String stmtString = "UPDATE " + TABLE_NAME + " SET "
+ COLUMN_NAME_LOCALTIME + "="
+ COLUMN_NAME_TIME + "+ (" + tzOffset + ")";
SQLiteStatement sqlStmt = db.compileStatement(stmtString);
int rows = sqlStmt.executeUpdateDelete();
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
我在这里使用一个事务,因为如果我添加新列但不能更新值,我希望所有内容都回滚,所以我可以尝试别的。