2011-07-12 46 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內部使用同樣的方法(...)方法。