我正在尝试使用rawQuery
和execSQL
方法来操作我的数据库,而不是.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()
方法中不起作用?
答案 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();
}
}