Frage

Ich arbeite an einem Projekt, bei dem ich Daten aus dem Web in eine SQLite-Datenbank herunterlade und speichere.Wenn ich mein Projekt ausführe, wird IllegalStateException (bereits geschlossen) angezeigt.

mein Logcat ist:

    09-29 12:14:49.485: E/AndroidRuntime(4956): FATAL EXCEPTION: AsyncTask #2
09-29 12:14:49.485: E/AndroidRuntime(4956): java.lang.RuntimeException: An error occured while executing doInBackground()
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.os.AsyncTask$3.done(AsyncTask.java:266)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.lang.Thread.run(Thread.java:1020)
09-29 12:14:49.485: E/AndroidRuntime(4956): Caused by: java.lang.IllegalStateException: database /data/data/com.irlsolutions.ittrading/databases/ITTrading.sqlite (conn# 0) already closed
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2134)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1526)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1508)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at com.irlsolutions.ittradinglibrary.Query_new.getItemFromEndOfDay(Query_new.java:89)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at com.irlsolutions.ittrading.Symbol_Fetcher.getSymbolFromLocal(Symbol_Fetcher.java:70)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at com.irlsolutions.ittrading.Markets$Markets_Thread.doInBackground(Markets.java:190)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at com.irlsolutions.ittrading.Markets$Markets_Thread.doInBackground(Markets.java:1)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

doInBackGround() ist:

protected Void doInBackground(Void... arg0) {

    float flt_close1;
    float flt_close2;
    float variation;

    // TODO Auto-generated method stub

    xmlData = XML_Parser_Helper.parseXmlSax(Markets.this, "", R.raw.market_indices_america);        
    lst_codes = xmlData.getListOfItems();

    xmlData = XML_Parser_Helper.parseXmlSax(Markets.this, "", R.raw.market_indices_europe);
    lst_codes.addAll(xmlData.getListOfItems());

    xmlData = XML_Parser_Helper.parseXmlSax(Markets.this, "", R.raw.market_indices_asia);
    lst_codes.addAll(xmlData.getListOfItems());

    for(int i = 0; i < lst_codes.size(); i++){
    lst_symbols.add(
        symbolFetcher.getSymbolFromLocal(
            lst_codes.get(i).get("symbol_code").toString(), 
            lst_codes.get(i).get("market_code").toString(), 
            xmlData,
            "symbols",
            lst_codes.get(i).get("chain_code").toString()
        )
    );
    lst_symbols.get(i).put("company_name", lst_codes.get(i).get("company_name").toString());
    lst_symbols.get(i).put("symbol_code", lst_codes.get(i).get("symbol_code").toString());
    lst_symbols.get(i).put("market_code", lst_codes.get(i).get("market_code").toString());
    lst_symbols.get(i).put("chain_code", lst_codes.get(i).get("chain_code").toString());
    lst_symbols.get(i).put("flag", lst_codes.get(i).get("flag").toString());

    flt_close1 = (float)Double.parseDouble((lst_symbols.get(i).get("close_1").toString().equals(""))?"0.0":lst_symbols.get(i).get("close_1").toString());
    flt_close2 = (float)Double.parseDouble((lst_symbols.get(i).get("close_2").toString().equals(""))?"0.0":lst_symbols.get(i).get("close_2").toString());
    variation = Generic_Functions.getVariation(flt_close1, flt_close2);

    lst_symbols.get(i).put("variation", variation);

    if(symbolFetcher.isSymbolAddedToPortfolio(str_username, lst_codes.get(i).get("symbol_code").toString(), lst_codes.get(i).get("market_code").toString())){
        lst_symbols.get(i).put("added", true);
    }else{
        lst_symbols.get(i).put("added", false);
    }

    publishProgress(new Void[]{});
    }

    return null;
}

Funktion, in der ich Abfrage verwende:

    public HashMap<String,Object> getItemFromEndOfDay(String str_symbolCode,String str_marketCode){
        HashMap<String,Object> hm = new HashMap<String, Object>();          

        Cursor cursor = database.rawQuery("SELECT * FROM " + Init.TABLE_END_OF_DAY + " WHERE symbol_code='" + str_symbolCode + "' AND market_code='" + str_marketCode + "'", null);


        if(cursor.getCount() > 0){
            cursor.moveToFirst();
            hm.put("symbol_code", cursor.getString(cursor.getColumnIndex("symbol_code")));
            hm.put("market_code", cursor.getString(cursor.getColumnIndex("market_code")));
            hm.put("instrument_name", cursor.getString(cursor.getColumnIndex("instrument_name")));
            hm.put("company_name", cursor.getString(cursor.getColumnIndex("company_name")));
            hm.put("isin", cursor.getString(cursor.getColumnIndex("isin")));
            hm.put("interval", cursor.getString(cursor.getColumnIndex("interval")));
            hm.put("exchange", cursor.getString(cursor.getColumnIndex("exchange")));
            hm.put("ex_open", cursor.getString(cursor.getColumnIndex("ex_open")));
            hm.put("ex_close", cursor.getString(cursor.getColumnIndex("ex_close")));
            hm.put("currency", cursor.getString(cursor.getColumnIndex("currency")));
            hm.put("timezone", cursor.getString(cursor.getColumnIndex("timezone")));

            hm.put("date_1", cursor.getString(cursor.getColumnIndex("date_1")));
            hm.put("hour_1", cursor.getString(cursor.getColumnIndex("hour_1")));
            hm.put("open_interest_1", cursor.getString(cursor.getColumnIndex("open_interest_1")));
            hm.put("open_1", cursor.getString(cursor.getColumnIndex("open_1")));
            hm.put("high_1", cursor.getString(cursor.getColumnIndex("high_1")));
            hm.put("low_1", cursor.getString(cursor.getColumnIndex("low_1")));
            hm.put("close_1", cursor.getString(cursor.getColumnIndex("close_1")));
            hm.put("volume_1", cursor.getString(cursor.getColumnIndex("volume_1")));

            hm.put("date_2", cursor.getString(cursor.getColumnIndex("date_2")));
            hm.put("hour_2", cursor.getString(cursor.getColumnIndex("hour_2")));
            hm.put("open_interest_2", cursor.getString(cursor.getColumnIndex("open_interest_2")));
            hm.put("open_2", cursor.getString(cursor.getColumnIndex("open_2")));
            hm.put("high_2", cursor.getString(cursor.getColumnIndex("high_2")));
            hm.put("low_2", cursor.getString(cursor.getColumnIndex("low_2")));
            hm.put("close_2", cursor.getString(cursor.getColumnIndex("close_2")));
            hm.put("volume_2", cursor.getString(cursor.getColumnIndex("volume_2")));

            cursor.close();
            return hm;
        }else{
                hm.put("symbol_code", str_symbolCode);
            hm.put("market_code", str_marketCode);
            hm.put("instrument_name","");
            hm.put("company_name", "");
            hm.put("isin", "");
            hm.put("interval", "");
            hm.put("exchange", "");
            hm.put("ex_open", "");
            hm.put("ex_close", "");
            hm.put("currency", "");
            hm.put("timezone", "America/New_York");

            hm.put("date_1", "");
            hm.put("hour_1", "");
            hm.put("open_interest_1", "");
            hm.put("open_1", "");
            hm.put("high_1", "");
            hm.put("low_1", "");
            hm.put("close_1", "");
            hm.put("volume_1", "");

            hm.put("date_2", "-");
            hm.put("hour_2", "");
            hm.put("open_interest_2", "");
            hm.put("open_2", "");
            hm.put("high_2", "");
            hm.put("low_2", "");
            hm.put("close_2", "");
            hm.put("volume_2", "");

            cursor.close();
            return hm;
        }
//      cursor.close();
//      return hm;
    }
War es hilfreich?

Lösung

Das Problem besteht nicht darin, es zweimal zu schließen, sondern darin, es nach dem Schließen zu verwenden.

Wenn Sie sich die Abfrage ansehen:

09-29 12:14:49.485: E/AndroidRuntime(4956): Caused by: java.lang.IllegalStateException: database /data/data/com.irlsolutions.ittrading/databases/ITTrading.sqlite (conn# 0) already closed
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2134)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1526)
09-29 12:14:49.485: E/AndroidRuntime(4956):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1508)

Sie sehen, es kommt von rawquery, eine Funktion, die Sie am Anfang verwenden getItemFromEndOfDay.Wenn ich mich also nicht irre, erhalten Sie diesen Fehler in der Anfang des Aufrufs der Funktion, da die Datenbank zu diesem Zeitpunkt noch nicht geöffnet ist.Sie können dies leicht überprüfen, indem Sie überprüfen, wie weit Sie im Code kommen.

Stellen Sie sicher, dass Sie nichts schließen, und versuchen Sie dann, die Datenbank ein zweites Mal zu verwenden.Fügen Sie einige Debug-Zeilen hinzu, um zu überprüfen, ob es sich tatsächlich um diese Zeile handelt und ob Sie zuvor etwas geschlossen haben.

Andere Tipps

Die Ausnahme zeigt an, dass Sie schließen, wenn der Cursor bereits geschlossen ist. Die Zeilennummer in der Ausnahme sagt Ihnen, wo;Zu einer Vermutung würde ich sagen, dass es in der anderen Block ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top