Получить обновленный счетчик строк из SQLite в Android с помощью необработанного запроса?

Как я могу получить количество строк, обновленных с помощью update заявление в SQLite в Android?

Обратите внимание, что мне нужно использовать какой-то тип необработанного выполнения оператора SQL, а не делать что-либо с ContentValues потому что мне нужен динамический запрос. Таким образом, я не могу использовать SQLiteDatabase.update() метод. Например, я бегу что-то вроде

UPDATE my_table 
   SET field_name = field_name + 1

Известные мне методы возврата void, например SQLiteDatabase.execSQL(), SQLiteDatabase.rawQuery() возвращает Cursor, но курсор имеет ноль строк и его счетчик всегда равен -1.

4 ответа

Решение

Вы можете сделать вставку любым удобным вам способом, а затем сделать выбор и использовать changes() функция для возврата количества затронутых строк.

Чтобы расширить ответ Мата, вот пример кода для получения обновленного количества строк:

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

Расширяя ответы Мэта и Панга...

Можем ли мы пропустить курсор и использовать simpleQueryForLong()?

например

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

Вы можете использовать метод SQLiteStatement.executeUpdateDelete для этого:

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

Тот же метод, который используется внутри методов SQLiteDatabase.update(...).

Другие вопросы по тегам