【问题标题】:execSQL() with UPDATE doesn't update带有 UPDATE 的 execSQL() 不更新
【发布时间】:2013-06-06 06:30:36
【问题描述】:

我正在尝试使用rawQueryexecSQL 方法来操作我的数据库,而不是.update.insert 等。我正在尝试使用以下代码执行更新:

db.execSQL("UPDATE configuration " +
                "SET number_fields = " + number_fields + ", "
                + "frequency = " + frequency + ", "
                + "ag = " + ag + ", "
                + "number_alarms = " + number_alarms + ", "
                + "failed_rapper = " + failed_rapper + ", "
                + "max_mv = " + max_mv + ", "
                + "max_nav = " + max_nav + " "
                + "WHERE serial_id = " + Integer.toString(id) + ";");

在此操作之后,有一个日志表明发生了更新并且它似乎可以工作,但是当我尝试在表上执行 select 语句时,它返回并显示以下错误:

06-10 10:01:47.564: W/System.err(3815): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

现在,我在 Android 中使用 SQLite 数据库浏览器手动插入的不同数据上执行了相同的 SELECT,它工作正常。我还在 SQLite 浏览器中执行了相同的 UPADTE,它在那里工作。因此,我知道问题在于 UPDATE 命令在 Android 上运行时不起作用。

问题:为什么 UPDATE 命令在 execSQL() 方法中不起作用?

【问题讨论】:

  • 乍一看,您的 UPDATE 语句看起来是正确的。您是否仔细检查过所有列名的拼写是否正确(这经常让我感到困惑)?此外,您确定所有变量都已初始化并包含将要插入到表中的列的有效值吗? (使用调试器单步执行可以帮助验证这一点)。如果这两件事都是正确的,也许您可​​以发布您的 SELECT 代码,因为那是实际错误发生的地方。
  • @MattDavis 似乎没有使用正确的值初始化表,然后在更新新值时不提交。感谢您的帮助。
  • 我明白了!很高兴你明白了。正确初始化表后,execSQL 方法是否最终会为更新工作?
  • @MattDavis 是的,它正在工作。谢谢。

标签: android sqlite sql-update android-sqlite


【解决方案1】:

来自Android SQLiteDatabase class documentation:

执行不是 SELECT 或任何其他 SQL 的单个 SQL 语句 返回数据的语句。

没有办法返回任何数据(比如受影响的人数 行)。相反,我们鼓励您使用 insert(String, String, 内容值),更新(字符串,内容值,字符串,字符串 [])等 al,如果可能的话。

然后:

对于 UPDATE 语句,请改用以下任何一种。

更新(字符串,内容值,字符串,字符串[])

updateWithOnConflict(String, ContentValues, String, String[], int)

据我所知,execSQL 方法更多用于更高级别的数据库操作,例如创建表和更改架构,而.query.update.delete 等方法应该是用于修改行。除了.update,我不确定您是否还有其他选择来执行此操作。

【讨论】:

    【解决方案2】:

    这是一个示例更新查询:

    public boolean updateCartTable(String retailerName, String mCouponId){
            final ContentValues values = new ContentValues();
    
            values.put(TableConstantName.COUPON_ONLY_STATUS, 1);
            values.put(TableConstantName.COUPON_SRORE_DEALS_STATUS, 1);
            values.put(TableConstantName.COUPON_CATAGORY, "C");
            try {
                sDb.beginTransaction();
                final boolean state = sDb.update(TableConstantName.COUPON_TABLE, values, TableConstantName.CART_COUPON_RETAILER_NAME + "=" + "'"+retailerName+"'"+ " AND "+TableConstantName.CART_COUPON_ID + "=" + "'"+mCouponId+"'", null)>0;
                sDb.setTransactionSuccessful();
                return state;
            } catch (SQLException e) {
                throw e;
            } finally {
                sDb.endTransaction();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2018-06-21
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多