2

I have a service that runs in the background which can access (read and write) to sqlite database. This perform syncing process of the app. The corresponding foreground process (main app) can also access (read and write) to sqlite database in my android application.

When syncing process going on and user try to access database using foreground process this error comes. I used synchronized to lock sqlite db but still this error comes.

synchronized (obj) {
    blogDbAdapter.open();
    todayBlogs = blogDbAdapter.getBlogsByDate(today, today, me, activity);
    blogDbAdapter.close();
}

This is the error:

    10-24 00:41:11.134: E/AndroidRuntime(1627): FATAL EXCEPTION: main
 Process: com.eyepax.horseapp, PID: 1627
 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:144)
    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
    at com.eyx.hor.data.dbadapters.BlogDbAdapter.getBlogsByDate(BlogDbAdapter.java:172)
    at com.eyx.hor.data.DataManager.getTodayBlogs(DataManager.java:2693)
    at com.eyx.hor.ui.activities.BlogListView.setDataAdapter(BlogListView.java:239)
    at com.eyx.hor.ui.activities.BlogListView.onCreateView(BlogListView.java:92)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

This is getBlogsByDate(),

public ArrayList<Blog> getBlogsByDate(java.util.Date fromDateU, java.util.Date toDateU, boolean me, Activity activity) {
    Date fromDate = new java.sql.Date(fromDateU.getTime());
    Date toDate = new java.sql.Date(toDateU.getTime());

    this.open();
    Cursor cursor = null;
    if (me) {
        String user = CommonUtils.getFromSharedPreference("USER_ID", "0", activity);
        cursor = database.rawQuery("select * from " + TABLE_NAME + " where date(" + DATE + ") BETWEEN '" + fromDate + "' AND '" + toDate + "' AND " + USER
                + " = " + user, null);
    } else {
        cursor = database.rawQuery("select * from " + TABLE_NAME + " where date(" + DATE + ") BETWEEN '" + fromDate + "' AND '" + toDate + "'", null);
    }

    ArrayList<Blog> list = null;
    if (cursor != null && cursor.moveToFirst()) {
        list = new ArrayList<Blog>();
        do {
            Blog blog = new Blog();
            blog.setBlogId(cursor.getString(cursor.getColumnIndex(BLOG_ID)));
            blog.setTitle(cursor.getString(cursor.getColumnIndex(TITLE)));
            blog.setDescription(cursor.getString(cursor.getColumnIndex(DESCRIPTION)));
            blog.setImageUrl(cursor.getString(cursor.getColumnIndex(IMAGE_URL)));
            blog.setDate(cursor.getString(cursor.getColumnIndex(DATE)));
            blog.setUser(cursor.getString(cursor.getColumnIndex(USER)));
            blog.setUserImageUrl(cursor.getString(cursor.getColumnIndex(USER_IMAGE_URL)));
            blog.setGroupId(cursor.getString(cursor.getColumnIndex(GROUP_ID)));

            list.add(blog);
        } while (cursor.moveToNext());
    }

    if (cursor != null)
        cursor.close();
    return list;
}
Danielson
  • 2,605
  • 2
  • 28
  • 51
user3800832
  • 421
  • 2
  • 8
  • 22
  • See here http://stackoverflow.com/questions/4242165/how-to-use-sqlite-from-services-in-android – Nabin Oct 24 '14 at 05:21
  • And here http://stackoverflow.com/questions/17348588/activity-and-background-service-access-to-sqlite-database – Nabin Oct 24 '14 at 05:22
  • Here as well . http://stackoverflow.com/questions/13146991/conflict-accessing-sqlite-database-android-from-service-and-onclick I am sure the problem will be solved. – Nabin Oct 24 '14 at 05:23
  • Is `blogDbAdapter.getTodayBlog()` being invoked somewhere else in your codes? Once `blogDbAdapter.close()` is called inside your synchronized block, any subsequent attempts to call the database without calling your `blogDbAdapter.open()` will fail. – ivan.sim Oct 24 '14 at 05:35
  • yes when i try to call getTodayBlog() this error comes. but after the sync it works perfectly. – user3800832 Oct 24 '14 at 06:27
  • any one know why this error comes?? please help – user3800832 Oct 27 '14 at 08:27

1 Answers1

0

The error says:

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

Then, you need open the connection.

Try using:

synchronized (obj) {
  blogDbAdapter.open();
  todayBlogs = blogDbAdapter.getBlogsByDate(today, today, me, activity);
  blogDbAdapter.close();
}
Benjamin RD
  • 11,516
  • 14
  • 87
  • 157