Mohammad Imran
Mohammad Imran

Reputation: 3273

Android SQLite closed exception

I have no solid background of synchronization. I think this issue will be fixed when I use synchronized method. But can anyone help me to fix this issue? Code is below:

public HashMap<String, FriendInfo> getAllRecordsInList_HashMap() {

        MySQLiteHelper dbHelper = MySQLiteHelper.getInstance(mActivity);
        HashMap<String, FriendInfo> list_map = new HashMap<String, FriendInfo>();

        SQLiteDatabase db = dbHelper.getReadableDatabase();
        // Cursor cursor = db.rawQuery("SELECT * from " +
        // dbHelper.tbl_friendlist, new String[] {});
        String[] cols = { dbHelper.id, dbHelper.name, dbHelper.picture, dbHelper.birthday, dbHelper.livein, dbHelper.gender, dbHelper.is_online, dbHelper.is_vip };
        Cursor cursor = db.query(dbHelper.tbl_friendlist, cols, null, null, null, null, dbHelper.name);

        if (cursor != null && cursor.getCount() > 0) {

            // some code here....
        }
        cursor.close();
        return list_map;
    }

Different threads can call this method getAllRecordsInList_HashMap(). Please advise how to fix this issue if I make synchronized method. Will it be fixed?

java.lang.IllegalStateException: Cannot perform this operation 
    because the connection pool has been closed. 

at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962) 
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599) 
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348) 
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894) 
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
at com.platinumapps.friendlist.BLL_Friendlist.getAllRecordsInList_HashMap(BLL_Friendlist.java:290) 
at com.platinumapps.activities.Messages_Activity.addViewTOLayout(Messages_Activity.java:753) 
at com.platinumapps.activities.Messages_Activity.access$3(Messages_Activity.java:744) 
at com.platinumapps.activities.Messages_Activity$1$3.run(Messages_Activity.java:141) 
at ndroid.app.Activity.runOnUiThread(Activity.java:4644) 
at com.platinumapps.activities.Messages_Activity$1.onReceive(Messages_Activity.java:136) 
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5039) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method)

Upvotes: 12

Views: 18871

Answers (2)

Zar E Ahmer
Zar E Ahmer

Reputation: 34370

According to Dianne Hackborn (Android framework engineer) there is no need to close the database in a content provider

A content provider is created when its hosting process is created, and remains around for as long as the process does, so there is no need to close the database it will get closed as part of the kernel cleaning up the process's resources when the process is killed.

So there is no need to close the database . it will automatically close when it is not needed.

Upvotes: 35

Henry
Henry

Reputation: 43758

You should not close the DB since it will be used again in the next call. So try to remove the

db.close();

from your code.

Upvotes: 20

Related Questions