Question

I'm working on a project where I'm downloading and saving data from web to sqlite database. when I'm running my project its shows IllegalStateException (already close).

my logcat is:

    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() is:

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

Function in which I'm using query:

    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;
    }
Was it helpful?

Solution

The issue isn't closing it twice, the issue is using it after it is close.

If you look at the query:

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)

You see it comes from rawquery, a function you use in the beginning of that getItemFromEndOfDay. So if I'm not mistaken, you get this error in the beginning of calling the function, because the database isn't open at that point. You could easily verify this by checking how far in the code you're getting.

Make sure you do not close anything and then try to use the database for a second time. Add some debug lines to verify it is indeed this line, and if you've closed anything before that.

OTHER TIPS

The exception indicates that you're calling close when the cursor is already closed. The line number in the exception will tell you where; at a guess I'd say it was in the else block

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top