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