Android java.lang.IllegalStateException:无法执行此操作,因为没有当前事务

Android java.lang.IllegalStateException:无法执行此操作,因为没有当前事务,android,exception,android-asynctask,transactions,connection,Android,Exception,Android Asynctask,Transactions,Connection,我创建了一个AsyncTask类,我在其中编写了这个部分(onPreExecute和doInBackgrond方法): 在线114有这样一个: dialog.show(); localDB.endTransaction(); 这很奇怪。。。有什么问题吗?谢谢。您可能在beginTransaction之前遇到异常。请将最后移动到另一个块,然后尝试内部的块 try { JSONArray UserJsonArray = connectAndCreateJsonArray(urls[

我创建了一个AsyncTask类,我在其中编写了这个部分(onPreExecute和doInBackgrond方法):

在线114有这样一个:

dialog.show();
localDB.endTransaction();

这很奇怪。。。有什么问题吗?谢谢。

您可能在
beginTransaction
之前遇到异常。请将
最后移动到另一个
块,然后尝试内部的

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();
}
试试{
JSONArray UserJsonArray=connectAndCreateJsonArray(URL[0]);
numUsers=UserJsonArray.length();
如果(numuers<1)返回numuers+“”;
试试{
localDB.beginTransaction();
for(int i=0;i
我有一个和你一样的错误,这是我的代码:

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();
}
我在
db.beginTransaction()
之前使用return,我的代码在
beginTransaction
之前使用return,但我在
中最后使用了
endTransaction
。如果您没有
beginTransaction
endTransaction
,则会出现异常。

如何

try{
  ...
} catch (Exception e) { // everything else
    e.printStackTrace();
} finally {
    if(localDB != null && localDB.inTransation()){
         localDB.endTransaction();
    }
}

如果在
localDB.beginTransaction()之前发生异常,则不要在代码中“…将finally移到内部的另一个try块”

则事务将不会打开,并且由于在finally block中您正试图关闭它,因此将抛出
非法状态异常
(事务尚未启动)

替换此代码:

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();
}
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();
}
试试{
JSONArray UserJsonArray=connectAndCreateJsonArray(URL[0]);
numUsers=UserJsonArray.length();
localDB.beginTransaction();
for(int i=0;i
关于此代码:

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();
}
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();
}
JSONArray UserJsonArray=connectAndCreateJsonArray(URL[0]);
numUsers=UserJsonArray.length();
localDB.beginTransaction();
试试{
for(int i=0;i

如有必要,可以将前两行包装在单独的
try catch

中,这样可以修复异常,但现在不会将任何内容写入本地数据库。numUsers i always 0。@smartmouse您是否看到任何堆栈跟踪…请仔细检查您的
connectAndCreateJsonArray
事实上,该类在几个小时前还运行良好。然后我在其他类中做了一些小改动,安装了一些SDK新文件,正如我前面所说的。可能是SDK相关的问题吗?@smartmouse很难说,也可能是您的代码更改。如果你得到的是
numUsers
0,我会检查它的代码。在这种情况下,您无论如何都不希望执行任何DB操作,因此可能需要添加一个
返回
if(numuers==0)。我想我已经解决了,我必须重新检查
connectAndCreateJsonArray
方法。不管怎样,您认为我必须应用您在回答中告诉我的try finally建议吗?因此,请检查有关db.beginTransaction和endTransaction的代码。希望这对您有所帮助。