Android SQLiteDatabase 事务和 AsyncTasc 问题

Android SQLiteDatabase transaction and AsyncTasc issue

我想我遗漏了一些东西,也许你们中的一个可以给我一个提示。

这是我的:

这是我的想法:

public class DBAdapter {
private static SQLiteDatabase database;
private static boolean isTransactionRunning;

public void beginTransaction() {
        database.beginTransaction();
        isTransactionRunning = true;
    }

public void endTransaction() {
        database.setTransactionSuccessful();
        database.endTransaction();
        isTransactionRunning = false;
    }

public void rollbackTransaction() {
        database.endTransaction();
        isTransactionRunning = false;
    }
}

在我的 activity 上,我打开数据库并启动 asynctask

protected class GetUserDataTask extends AsyncTask<Boolean, Bundle, Bundle> {
    @Override
        protected Bundle doInBackground(Boolean... values) {

         db.beginTransaction();

         for (Object obj : response.getData()) {
            if (isCancelled()) {
                return null;
            }
          ///some processing

         for (Object obj : response.getData()) {
            if (isCancelled()) {
                return null;
            }
      }

       @Override
        protected void onCancelled() {
            super.onCancelled();

            if (db.isTransactionRunning()) {
                db.rollbackTransaction();
            }
        }
     }

       @Override
        protected void onPostExecute(Bundle result) {
           if (db.isTransactionRunning()) {
            if (!error){
              db.endTransaction()
            } else{
                db.rollbackTransaction();
            }
     }

我在取消 AsyncTask 时遇到的错误是:

java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.

它在使用 onCancelled() 触发时发生。

我做错了什么?

你有那么多地方处理commit/rollback是什么原因吗?

我不知道为什么会出现这个错误。

但如果您简化代码,也许会有帮助

  • 消除静电 DBAdapter.isTransactionRunning
  • 在一个块中处理 beginTransaction、endTransaction 和 rollbackTransaction

像这样:

protected class GetUserDataTask extends AsyncTask<Boolean, Bundle, Bundle> {
    @Override
        protected Bundle doInBackground(Boolean... values) {
            boolean inTransaction = true;
            try {
                 db.beginTransaction();

                 for (Object obj : response.getData()) {
                    if (isCancelled()) {
                        return null;
                    }
                  ///some processing
                 }

                 for (Object obj : response.getData()) {
                    if (isCancelled()) {
                        return null;
                    }
                 }

                if (isCancelled()) {
                    return null;
                }

                // every thing worked well without cancel
                inTransaction = false;
                db.endTransaction();
                return processingResult;

            } finally {
                if (inTransaction) {
                    db.rollbackTransaction();
                }
            }
        }