带UPDATE的execSQL()不会更新

时间:2013-06-10 14:46:40

标签: android sqlite sql-update android-sqlite

我正在尝试使用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,它在那里工作。因此我知道问题是在Android上运行时UPDATE命令不起作用。

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

2 个答案:

答案 0 :(得分:5)

来自Android SQLiteDatabase class documentation:

  

执行一个非SELECT或任何其他SQL的SQL语句   返回数据的语句。

     

它无法返回任何数据(例如受影响的数量)   行)。相反,我们鼓励你使用insert(String,String,   ContentValues),update(String,ContentValues,String,String [])等   al,如果可能的话。

然后:

  

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

     

update(String,ContentValues,String,String [])

     

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

据我所知,execSQL方法更适用于更高级别的数据库操作,例如创建表和更改架构,以及.query.update,{{1应该使用等方法来修改行。我不确定除.update之外还有其他选项可以执行此操作。

答案 1 :(得分: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();
        }
    }