2011-07-12 45 views
8

Làm cách nào để có được số hàng được cập nhật bằng câu lệnh update trong SQLite trong Android?Nhận các hàng được cập nhật tính từ SQLite trong Android bằng truy vấn thô?

Lưu ý rằng tôi cần sử dụng một số loại thực thi thô của câu lệnh SQL, thay vì làm bất cứ điều gì với ContentValues vì tôi cần truy vấn động. Do đó tôi không thể sử dụng phương thức SQLiteDatabase.update(). Ví dụ: tôi đang chạy một cái gì đó như

UPDATE my_table 
    SET field_name = field_name + 1 

Các phương pháp tôi biết về khoảng trống, ví dụ: SQLiteDatabase.execSQL(). SQLiteDatabase.rawQuery() trả về một Cursor, nhưng con trỏ có 0 hàng và số của nó luôn là -1.

Trả lời

15

Bạn có thể thực hiện thao tác chèn theo bất kỳ cách nào bạn muốn, sau đó chọn và sử dụng chức năng changes() để trả về số hàng bị ảnh hưởng.

+0

Phương pháp đó có sẵn trong API Android không? –

+0

Đó là một hàm sqlite. Bạn sử dụng nó trong các truy vấn 'select' - độc lập với ngôn ngữ bạn đang sử dụng. – Mat

+1

Ah. Tuyệt quá! Tôi tưởng tượng nó là khôn ngoan để bọc các cuộc gọi như vậy với các giao dịch. Vì vậy, bạn muốn làm 1) bắt đầu tran 2) làm cập nhật 3) nhận được thay đổi 4) kết thúc giao dịch. Nó hoạt động, cảm ơn! –

10

Mở rộng trên Mat's answer, đây là mã ví dụ cho việc đếm hàng Cập nhật:

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

Tôi sẽ sử dụng cách tiếp cận đơn giản này: 'cursor.getLong (0)'. –

4

Mở rộng trên Mat và câu trả lời Pang của ...

Chúng ta có thể bỏ qua các con trỏ và sử dụng simpleQueryForLong() ?

ví dụ:

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

Bạn có thể sử dụng phương pháp SQLiteStatement.executeUpdateDelete cho việc này:

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

Cùng một phương pháp sử dụng trong nội SQLiteDatabase.update (...) phương pháp.

Các vấn đề liên quan