【问题标题】:Android database rawQuery not working as expectedAndroid 数据库 rawQuery 未按预期工作
【发布时间】:2015-07-09 12:09:44
【问题描述】:

这是我要运行的代码:

        open();
        database.beginTransaction();

        Cursor cursor = database.rawQuery("UPDATE message SET is_read=1 WHERE id = 'user1' AND (mid IN ('msg1','msg2'))",null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                <... success ...>
            }
            cursor.close();
        }
        database.endTransaction();
        close();

它不起作用 - 响应成功,但我的光标没有更新的行。

针对同一数据库的相同查询在纯 SQL 中工作得非常好(我使用的是 sqlitebrowser)。这里发生了什么?

【问题讨论】:

  • 试试 AND mid IN ('msg1','msg2')
  • 为什么你认为UPDATE 的行为类似于SELECT
  • @EagleEye 感谢您的建议 - 之前尝试过,再次尝试,同样的结果。 @Blackbelt 我所期望的只是光标内的 mUpdateRows 大小为 != 0 - 如果您在谈论 moveToFirst - 这只是有人在另一篇文章中建议的内容。我只需要计数

标签: android sql sqlite


【解决方案1】:

由于这是更新,我建议您将rawQuery 更改为execSQL

两者的区别在此详述:difference between rawquery and execSQL in android sqlite database

【讨论】:

    【解决方案2】:

    试试这个,交易完成后需要设置交易成功。

    Cursor cursor = database.rawQuery("UPDATE message SET is_read=1 WHERE id = 'user1' AND (mid IN ('msg1','msg2'))",null);
      if (cursor != null) {
            if (cursor.moveToFirst()) {
                 <... success ...>
             }
             cursor.close();
            }
        database.setTransactionSuccessful();
        database.endTransaction();
        close();
    

    【讨论】:

    • 交易必须标记为成功。如果您不这样做,事务中的所有更改都将被回滚。 sqlite.org/lang_transaction.html
    • 如果你调用 transactionSuccessful 那么只有它提交,否则它会回滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多