android更新数据库列基于当前列值

时间:2013-11-22 02:54:34

标签: android sql database

在android中,SQLiteDatabase具有更新功能

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

values中的新值 如果我想通过添加一列来更新列A,我应该如何准备ContentValues值变量?我不认为以下内容可行。

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

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

2 个答案:

答案 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();
}

我在这里使用一个事务,因为如果我添加新列但不能更新值,我希望所有内容都回滚,所以我可以尝试别的。