[英]java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction
I created an AsyncTask class in which i write this part (onPreExecute and doInBackgrond methods): 我创建了一个AsyncTask类,其中编写了这一部分(onPreExecute和doInBackgrond方法):
@Override
protected void onPreExecute() {
// Instantiate ProgressDialog and Set style to STYLE_HORIZONTAL
dialog = new ProgressDialog(context);
dialog.setIndeterminate(false);
dialog.setMax(100);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.setTitle("Update");
dialog.setMessage("Download data. Please wait...");
dialog.show();
super.onPreExecute();
}
@Override
protected String doInBackground(String... urls) {
int count = 0;
int numUsers = 0;
db = new Database(context);
SQLiteDatabase localDB = db.getWritableDatabase();
try {
JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
numUsers = UserJsonArray.length();
localDB.beginTransaction();
for (int i = 0; i < numUsers; i++) {
JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
localDB.insert("Users", null, getParsedUserEntry(jObj));
count++;
publishProgress(count * 100 / numUsers);
}
localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
Log.e("Msg", "catch");
} finally {
localDB.endTransaction();
}
return numUsers+"";
}
private JSONArray connectAndCreateJsonArray(String url) {
JSONArray jsonArray = new JSONArray();
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.example.com/file.json");
request.addHeader("Cache-Control", "no-cache");
try {
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
InputStreamReader in = new InputStreamReader(entity.getContent());
BufferedReader reader = new BufferedReader(in);
StringBuilder stringBuilder = new StringBuilder();
String line = "";
while ((line=reader.readLine()) != null) {
stringBuilder.append(line);
}
jsonArray = new JSONArray(stringBuilder.toString());
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return jsonArray;
}
I have always worked fine, but today after some modifies to other classes and after installing 2 package from Android SDK Manager, it stopped to work. 我一直工作得很好,但是今天在将某些内容修改为其他类之后,并从Android SDK Manager安装了2个软件包后,它停止工作了。 (i installed Android SDK Build-Tools v20 and Android SDK Tools to version 23.0.5).
(我安装了Android SDK Build-Tools v20和Android SDK Tools到版本23.0.5)。
Now i get this error: java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction 现在我收到此错误: java.lang.IllegalStateException:无法执行此操作,因为没有当前事务
Here is my LogCat: 这是我的LogCat:
10-13 02:11:36.700: E/AndroidRuntime(31210): FATAL EXCEPTION: AsyncTask #1
10-13 02:11:36.700: E/AndroidRuntime(31210): Process: com.example.myapp, PID: 31210
10-13 02:11:36.700: E/AndroidRuntime(31210): java.lang.RuntimeException: An error occured while executing doInBackground()
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.os.AsyncTask$3.done(AsyncTask.java:300)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.lang.Thread.run(Thread.java:841)
10-13 02:11:36.700: E/AndroidRuntime(31210): Caused by: java.lang.IllegalStateException: Cannot perform this operation because there is no current transaction.
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.database.sqlite.SQLiteSession.throwIfNoTransaction(SQLiteSession.java:915)
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:398)
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
10-13 02:11:36.700: E/AndroidRuntime(31210): at com.example.myapp.DownloadDataFromServer.doInBackground(DownloadDataFromServer.java:114)
10-13 02:11:36.700: E/AndroidRuntime(31210): at com.example.myapp.DownloadDataFromServer.doInBackground(DownloadDataFromServer.java:1)
10-13 02:11:36.700: E/AndroidRuntime(31210): at android.os.AsyncTask$2.call(AsyncTask.java:288)
10-13 02:11:36.700: E/AndroidRuntime(31210): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-13 02:11:36.700: E/AndroidRuntime(31210): ... 4 more
10-13 02:11:37.765: E/WindowManager(31210): android.view.WindowLeaked: Activity com.example.myapp.Main has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{420f12e8 V.E..... R....... 0,0-480,322} that was originally added here
10-13 02:11:37.765: E/WindowManager(31210): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:346)
10-13 02:11:37.765: E/WindowManager(31210): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
10-13 02:11:37.765: E/WindowManager(31210): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-13 02:11:37.765: E/WindowManager(31210): at android.app.Dialog.show(Dialog.java:286)
10-13 02:11:37.765: E/WindowManager(31210): at com.example.myapp.DownloadDataFromServer.onPreExecute(DownloadDataFromServer.java:49)
10-13 02:11:37.765: E/WindowManager(31210): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
10-13 02:11:37.765: E/WindowManager(31210): at android.os.AsyncTask.execute(AsyncTask.java:535)
10-13 02:11:37.765: E/WindowManager(31210): at com.example.myapp.Main.onOptionsItemSelected(Main.java:151)
10-13 02:11:37.765: E/WindowManager(31210): at android.app.Activity.onMenuItemSelected(Activity.java:2600)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1065)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:741)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:884)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:177)
10-13 02:11:37.765: E/WindowManager(31210): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
10-13 02:11:37.765: E/WindowManager(31210): at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
10-13 02:11:37.765: E/WindowManager(31210): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
10-13 02:11:37.765: E/WindowManager(31210): at android.widget.AbsListView$3.run(AbsListView.java:3645)
10-13 02:11:37.765: E/WindowManager(31210): at android.os.Handler.handleCallback(Handler.java:733)
10-13 02:11:37.765: E/WindowManager(31210): at android.os.Handler.dispatchMessage(Handler.java:95)
10-13 02:11:37.765: E/WindowManager(31210): at android.os.Looper.loop(Looper.java:136)
10-13 02:11:37.765: E/WindowManager(31210): at android.app.ActivityThread.main(ActivityThread.java:5146)
10-13 02:11:37.765: E/WindowManager(31210): at java.lang.reflect.Method.invokeNative(Native Method)
10-13 02:11:37.765: E/WindowManager(31210): at java.lang.reflect.Method.invoke(Method.java:515)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
10-13 02:11:37.765: E/WindowManager(31210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
10-13 02:11:37.765: E/WindowManager(31210): at dalvik.system.NativeStart.main(Native Method)
On line 49 there is this: 在第49行上是这样的:
dialog.show();
Online 114 there is this: 在线114有这个:
localDB.endTransaction();
It is very strange... what could be the problem? 这很奇怪...可能是什么问题? Thank you.
谢谢。
you could be hitting an exception before beginTransaction
..move the finally
to another try
block inside 你可能会打一个异常之前
beginTransaction
..move的finally
到另一个try
块内
try {
JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
numUsers = UserJsonArray.length();
if (numUsers < 1) return numUsers + "";
try {
localDB.beginTransaction();
for (int i = 0; i < numUsers; i++) {
JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
localDB.insert("Users", null, getParsedUserEntry(jObj));
count++;
publishProgress(count * 100 / numUsers);
}
localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
Log.e("Msg", "catch");
} catch (Exception e) { // everything else
e.printStackTrace();
} finally {
localDB.endTransaction();
}
} catch (Exception e) { // everything else
e.printStackTrace();
}
what about 关于什么
try{
...
} catch (Exception e) { // everything else
e.printStackTrace();
} finally {
if(localDB != null && localDB.inTransation()){
localDB.endTransaction();
}
}
instead of " ... move the finally to another try block inside" ? 而不是“ ...将最终移动到另一个try块中”?
In your code, if an exception occurs before localDB.beginTransaction();
在您的代码中,如果在
localDB.beginTransaction();
之前发生异常localDB.beginTransaction();
then the transaction will not be opened, and due to the fact that in finally block you are trying to close it, an IllegalStateException
will be thrown (transaction has not been started). 那么该事务将不会打开,并且由于您在finally块中尝试关闭该事务,将
IllegalStateException
(尚未启动事务)。
Replace this code: 替换此代码:
try {
JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
numUsers = UserJsonArray.length();
localDB.beginTransaction();
for (int i = 0; i < numUsers; i++) {
JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
localDB.insert("Users", null, getParsedUserEntry(jObj));
count++;
publishProgress(count * 100 / numUsers);
}
localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
Log.e("Msg", "catch");
} finally {
localDB.endTransaction();
}
On this code: 在此代码上:
JSONArray UserJsonArray = connectAndCreateJsonArray(urls[0]);
numUsers = UserJsonArray.length();
localDB.beginTransaction();
try {
for (int i = 0; i < numUsers; i++) {
JSONObject jObj = (JSONObject) UserJsonArray.getJSONObject(i);
localDB.insert("Users", null, getParsedUserEntry(jObj));
count++;
publishProgress(count * 100 / numUsers);
}
localDB.setTransactionSuccessful();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
Log.e("Msg", "catch");
} finally {
localDB.endTransaction();
}
If necessary, the first two lines can be wrapped in a separate try-catch
. 如有必要,可以将前两行包装在单独的
try-catch
。
I have an error like yours, here is my code: 我有一个像您一样的错误,这是我的代码:
try {
String sql = "SELECT * FROM "+DB_TABLEDOWNLOAD;
Cursor cursor = db.rawQuery(sql, null);
//空双引号为原表没有的字段
String temp = "";
int existIconPath = cursor.getColumnIndex("iconPath");
int existAudioID = cursor.getColumnIndex("audioID");
if (existIconPath == -1 && existAudioID == -1){
temp = "url, downed,total,path,name, audioTitle, audioFileID,\"\",\"\"";
}else if (existIconPath == -1 && existAudioID != -1){//iconPath不存在
temp = "url, downed,total,path,name, audioTitle, audioFileID,\"\",audioID";
}else if (existIconPath != -1 && existAudioID == -1){//audioID不存在
temp = "url, downed,total,path,name, audioTitle, audioFileID,iconPath,\"\"";
}else {
return;
}
db.beginTransaction();
String tempTableName = "_temp_"+DB_TABLEDOWNLOAD;
String sqlCreateTemp = " ALTER TABLE "+DB_TABLEDOWNLOAD+" RENAME TO "+tempTableName+";";
db.execSQL(sqlCreateTemp);
final String TB_TESTPAPERINFO_CREATE = "Create TABLE IF NOT EXISTS "
+ DB_TABLEDOWNLOAD
+ "(url TEXT, downed TEXT,total TEXT,path TEXT,name TEXT, audioTitle TEXT, audioFileID TEXT,iconPath TEXT, audioID TEXT);";
db.execSQL(TB_TESTPAPERINFO_CREATE);
String sqlBackupData = "INSERT INTO "+DB_TABLEDOWNLOAD+" SELECT "+temp+" FROM "+tempTableName+";";
db.execSQL(sqlBackupData);
String sqlDrop = "DROP TABLE IF EXISTS '"+tempTableName+"';";
db.execSQL(sqlDrop);
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
}finally{
db.endTransaction();
}
I use return before db.beginTransaction()
, my code return before beginTransaction
, but I endTransaction
in finally
. 我用回之前
db.beginTransaction()
之前我的代码返回beginTransaction
,但我endTransaction
在finally
。 If you do not beginTransaction
and endTransaction
, the exception will appear. 如果您没有
beginTransaction
和endTransaction
,则会出现异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.