2

如果您正在使用事务并且 sql 操作失败,我知道它会回滚所有更改,但是它会在 finally 语句之后停止所有代码还是会继续运行其余代码?

下面的代码看起来是正确的还是我应该使用 catch 语句?是否可以出于测试目的模拟错误?

public static boolean updateSuccessful = false;

updateToVersion2();
//Does anything after here still run on error?

if(!updateSuccessful) {
    deleteAndRecreateDatabase();
}


public void updateToDbVersion2() {
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } finally {
        this.myDataBase.endTransaction();
    }
}
4

3 回答 3

1

你应该捕捉到异常!为什么你把它遗漏了让代码闻起来很糟糕......

如果在您结束事务的部分之间确实发生了异常execSQLsetTransactionSuccessful并最终落入finally您结束事务的部分,该怎么办?

代码可能是这样的:

public void updateToDbVersion2() {
    boolean fubar = false;
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } catch(Exception ex){
        fubar = true;
        // Do whatever is needed to be done such as logcat FOR debugging ONLY!
    } finally {
        if (!fubar){
            // No exceptions occurred, OK to end transaction
            this.myDataBase.endTransaction();
        }
    }
}

请注意对finally子句的条件检查如何确保防止潜在的混乱并确保数据完整性。

于 2012-08-10T21:55:13.640 回答
0

有一组例外

http://developer.android.com/reference/android/database/SQLException.html

以及网络上的一些相关示例和建议

Android数据库错误?

为什么 SQLException 不能捕获 SQLiteExcpetion?

于 2012-08-10T20:53:43.283 回答
0

交易本身作为一个整体。它要么成功要么失败,这意味着您要么在数据库中获得所有数据,要么一无所获(当然是在此事务中)。如果事务在某个时候失败,它应该首先进入“catch”部分,然后再进入“finally”。

正如 user827992 所指出的,捕获异常会很有趣。那里可能有一些额外的(也许是有价值的)信息。

于 2012-08-10T21:22:41.793 回答