2011-07-12 28 views
8

如何在Android中使用SQLite中的update语句获取更新的行数?使用原始查询从Android中的SQLite获取更新的行数?

请注意,我需要使用某种类型的SQL语句的原始执行,而不是对ContentValues执行任何操作,因为我需要动态查询。因此我无法使用SQLiteDatabase.update()方法。例如,我正在运行类似于

UPDATE my_table 
    SET field_name = field_name + 1 

我知道的方法返回void,例如, SQLiteDatabase.execSQL()SQLiteDatabase.rawQuery()返回Cursor,但游标有零行,其计数始终为-1。

回答

15

您可以根据需要执行插入操作,然后执行select操作并使用changes()函数返回受影响的行数。

+0

该方法是否可用于Android API? –

+0

这是一个sqlite函数。您可以在'select'查询中使用它 - 与您正在使用的语言无关。 – Mat

+1

啊。大!我可以想象,将这种调用与事务打包是明智的。所以你会做1)开始tran 2)做更新3)获得变化4)结束交易。它的工作原理,谢谢! –

10

要在Mat's answer扩大,以下是获取更新的行数的示例代码:

Cursor cursor = null; 
try 
{ 
    cursor = db.rawQuery("SELECT changes() AS affected_row_count", null); 
    if(cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) 
    { 
     final long affectedRowCount = cursor.getLong(cursor.getColumnIndex("affected_row_count")); 
     Log.d("LOG", "affectedRowCount = " + affectedRowCount); 
    } 
    else 
    { 
     // Some error occurred? 
    } 
} 
catch(SQLException e) 
{ 
    // Handle exception here. 
} 
finally 
{ 
    if(cursor != null) 
    { 
     cursor.close(); 
    } 
} 
+3

我会用这个更简单的方法:'cursor.getLong(0)'。 –

4

扩大在垫子和庞的答案...

我们可以略过光标,使用simpleQueryForLong()

例如

public long getChangesCount() { 
    SQLiteDatabase db = getReadableDatabase(); 
    SQLiteStatement statement = db.compileStatement("SELECT changes()"); 
    return statement.simpleQueryForLong(); 
} 
1

可以使用SQLiteStatement.executeUpdateDelete方法是:

SQLiteDatabase db = getReadableDatabase(); 
SQLiteStatement statement = db.compileStatement("[your sql here]"); 
int affectedRows = statement.executeUpdateDelete(); 

在SQLiteDatabase.update内部使用同样的方法(...)方法。