Android SQLiteDatabase事务和AsyncTasc问题

时间:2015-08-03 15:11:22

标签: android android-asynctask android-sqlite sqliteopenhelper

我想我错过了一些东西,也许你们其中一个人可以给我一个提示。

这就是我所拥有的:

  • 一个带有许多for循环的AsyncTask,它从a获取分页数据 网络服务
  • 存储检索数据的SQLiteDatabase
  • 用户 有可能通过按a取消线程 按钮,需要所有插入/处理的数据的情况 除去。

以下是我的想法:

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;
    }
}

在我的活动中,我打开数据库并启动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:无法执行此操作,因为   目前没有交易。

并且它在使用onCancelled()时触发。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

为什么有这么多地方可以处理提交/回滚?

我不知道错误发生的原因。

但如果你简化代码,也许它会有所帮助

  • 终止静态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();
                }
            }
        }