Android SQLiteDatabase 事务和 AsyncTasc 问题
Android SQLiteDatabase transaction and AsyncTasc issue
我想我遗漏了一些东西,也许你们中的一个可以给我一个提示。
这是我的:
- 具有许多 for 循环的 AsyncTask,它从
网络服务
- 存储检索数据的 SQLiteDatabase
- 用户
可以随时通过按 a 来取消线程
按钮,需要所有 inserted/processed 数据的情况
已删除。
这是我的想法:
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();
}
}
}
我想我遗漏了一些东西,也许你们中的一个可以给我一个提示。
这是我的:
- 具有许多 for 循环的 AsyncTask,它从 网络服务
- 存储检索数据的 SQLiteDatabase
- 用户 可以随时通过按 a 来取消线程 按钮,需要所有 inserted/processed 数据的情况 已删除。
这是我的想法:
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();
}
}
}