所以我有一个数据库,SQLiteDatabase db
我在我的经理类中编写了一些私有方法,这些方法将由公共方法调用:
public void updateData (MakeabilityModel newData){
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
try {
reWriteSVTable(db, list);
db.setTransactionSuccessful();
} catch (Exception e){
//TODO through rollback message?
e.printStackTrace();
} finally {
db.endTransaction();
}
}
//Private Methods
private void clearTable(SQLiteDatabase db, String table){
db.delete(table, null, null);
}
private void reWriteSVTable(SQLiteDatabase db, List<MakeabilityLens> lenses){
clearTable(db, singleVision);
ContentValues cv;
for(int i=0; i<lenses.size(); i++){
cv = new ContentValues();
cv.put(colScreenID, hsID);
cv.put(colIconID, id);
cv.put(colRank, hsTotal);
db.insert(isLookUp, colID, cv);
}
}
我的问题是这个..我希望能够将sql异常抛回公共方法,这样如果有异常,它将终止事务并回滚所有数据..
似乎使用delete()和insert()方法比execSQL()更干净但不抛出sqlExceptions。 execSQL()另一方面呢?我是否需要使用execSQL?我如何确保它应该在任何私有方法中引发异常,它将捕获它并在私有方法中将其回滚
答案 0 :(得分:0)
如果sql字符串无效,首先execSQL()
会抛出异常。这是sql字符串语法的异常,而不是sql操作。也就是说,如果sql语句有效但操作失败(例如由于约束),它将不会抛出异常。
所以......
基本上execSQL()
和delete()
之间的唯一区别是delete()
返回受影响的行数(在您的情况下,已删除的行数),但execSQL()
没有。
注意:
要使delete()
返回受影响的行数,您必须在where子句参数中传递null
以外的任何值。在您的情况下,传递"1"
。