【问题标题】:Get updated rows count from SQLite in Android using a raw query?使用原始查询从 Android 中的 SQLite 获取更新的行数?
【发布时间】:2011-07-12 05:00:04
【问题描述】:

如何在 Android 的 SQLite 中使用update 语句获取更新的行数?

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

UPDATE my_table 
   SET field_name = field_name + 1

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

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    您可以随心所欲地进行插入,然后进行选择并使用changes() 函数返回受影响的行数。

    【讨论】:

    • Android API 中是否提供该方法?
    • 这是一个 sqlite 函数。您可以在 select 查询中使用它 - 与您使用的语言无关。
    • 啊。伟大的!我想用交易来包装这样的电话是明智的。所以你会做 1) 开始 tran 2) 做更新 3) 获取更改 4) 结束事务。成功了,谢谢!
    • @Tyler Collier 您能否提供一个示例,如何在更新后选择受影响的行?谢谢!
    • @Gosha,单击 Mat 答案中的 changes() 链接以获取有关 changes() 的帮助。
    【解决方案2】:

    为了扩展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();
        }
    }
    

    【讨论】:

    • 我会使用这种更简单的方法:cursor.getLong(0).
    【解决方案3】:

    扩展 Mat 和 Pang 的答案...

    我们可以跳过光标并使用 simpleQueryForLong() 吗?

    例如

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

    【讨论】:

      【解决方案4】:

      您可以为此使用 SQLiteStatement.executeUpdateDelete 方法:

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

      与 SQLiteDatabase.update(...) 方法内部使用的方法相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        相关资源
        最近更新 更多