Hi Mariano, I use close only once. The DB object is held in an Android service. When the service stops the DB object is closed. I think you should not have two opened DB objects at the same time.
Mirko On 23 Okt., 22:09, Mariano Kamp <mariano.k...@gmail.com> wrote: > Hey Mirko, > thank you very much for taking the time to give me such a detailed and > easy to understand answer. > > I think that I already have implemented my code the way you describe as I > originally started out with the Notepad > example<http://developer.android.com/guide/tutorials/notepad/notepad-ex1.html>and > that does it the same way. Except that I don't use transactions. > However > in the lock situation from above (see the two stack traces I quoted above) > the concurrent accesses were reads, so the transactions idea doesn't apply, > or does it? > > Reading your mail I thought of something else. Maybe I should open a read > only database? That would be a separate instance then. > > mAllPurposeDatabase = dbOpenerHelper.getWritableDatabase(); > mSlowQueryDatabase = dbOpenerHelper.getReadableDatabase(); > > And then I will direct the slow queries always to the 2nd instance. It > wouldn't matter much if the database contains old data, it's just used for > search. I may > setLockingEnabled()<http://developer.android.com/reference/android/database/sqlite/SQLite...)>to > false, but as the queries are slow it probably won't matter much. > > Something completely different. Do you use close() on the database at all? > If so, when? > > Cheers, > Mariano > > On Fri, Oct 23, 2009 at 7:16 PM, mirko <mirkocze...@googlemail.com> wrote: > > > Hi Mariano, > > > I had the same problems with my app. After reading a little bit on the > > SQLite Website my understanding was that locking is done with process > > (thread) locks. So there are many reader treads possible, but only one > > writer thread. For this reason your SQLiteDatabase object needs to be > > a singleton. I think otherwise the database file will be opened > > several times. In my app I get the singleton with: > > > mDatabase = dbOpenerHelper.getWritableDatabase(); > > > This is only called once and every call to the Database uses the same > > mDatabase object, > > > Every time I read in the database I do not open a transaction, only a > > cursor, like this: > > > public static PlaylistItem queryCurrentTrackInDB(SQLiteDatabase db, > > String playlistID) { > > PlaylistItem ret = null; > > String whereClause = PlaylistItem.COL_PLAYLIST_ID + "=?"; > > String[] whereValues = new String[] { playlistID }; > > String orderClause = PlaylistItem.COL_CURRENT_TRACK + " > > DESC," + > > PlaylistItem.COL_NUMBER; > > Cursor cur = db.query(IConstants.PLAYLIST_TABLE, null, > > whereClause, > > whereValues, null, null, orderClause, "2"); > > if (cur.moveToFirst()) { > > ret = new PlaylistItem(cur); > > } > > cur.close(); > > return ret; > > } > > > Every time I write to the database I use a transaction: > > > public static boolean deletePlaylistByID(SQLiteDatabase db, String > > playlistID) { > > db.beginTransaction(); > > int r = 0; > > try { > > String whereClause = PlaylistItem.COL_PLAYLIST_ID + > > "=?"; > > String[] whereValues = new String[] { playlistID}; > > r = db.delete(IConstants.PLAYLIST_TABLE, > > whereClause, whereValues); > > db.setTransactionSuccessful(); > > } finally { > > db.endTransaction(); > > } > > return r > 0; > > } > > > I have a lot of concurrency in my app and after changing it the > > described way it works quite well. > > > Mirko > > > On 23 Okt., 18:14, Mariano Kamp <mariano.k...@gmail.com> wrote: > > > Hi, > > > > I have implemented a slow search provider that queries my database. Now > > > when at the same time I do another read access my applications stalls > > (ANR). > > > > It's both read and I don't see why there should be a lock. What are my > > > options to get a little more concurrency here? > > > > Cheers, > > > Mariano > > > > Here are the two threads that block each other. > > > > One: > > > "main" prio=5 tid=3 WAIT > > > | group="main" sCount=1 dsCount=0 s=N obj=0x4001db08 self=0xbc48 > > > | sysTid=2680 nice=0 sched=0/0 handle=-1343996920 > > > at java.lang.Object.wait(Native Method) > > > - waiting on <0x271f30> (a java.lang.VMThread) > > > at java.lang.Thread.parkFor(Thread.java:1499) > > > at java.lang.LangAccessImpl.parkFor(LangAccessImpl.java:48) > > > at sun.misc.Unsafe.park(Unsafe.java:319) > > > at java.util.concurrent.locks.LockSupport.park(LockSupport.java:117) > > > at > > > java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:680) > > > at > > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:710) > > > at > > > java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1040) > > > at > > > java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:193) > > > at > > java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:252) > > > at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:292) > > > at > > > android.database.sqlite.SQLiteDatabase.addSQLiteClosable(SQLiteDatabase.java:221) > > > at android.database.sqlite.SQLiteProgram.<i > > > nit>(SQLiteProgram.java:57) > > > at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) > > > at > > > android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49) > > > at > > > android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118) > > > at > > > android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092) > > > at com.newsrob.DB.findCursorByQueryString(DB.java:419) > > > at com.newsrob.EntryManager.getArticleAsCursor(EntryManager.java:1010) > > > at > > > com.newsrob.activities.ShowArticleActivity.onCreate(ShowArticleActivity.java:81) > > > at > > > android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) > > > at > > > android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) > > > at > > > android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) > > > at android.app.ActivityThread.access$2100(ActivityThread.java:116) > > > at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) > > > at android.os.Handler.dispatchMessage(Handler.java:99) > > > at android.os.Looper.loop(Looper.java:123) > > > at android.app.ActivityThread.main(ActivityThread.java:4203) > > > at java.lang.reflect.Method.invokeNative(Native Method) > > > at java.lang.reflect.Method.invoke(Method.java:521) > > > at > > > com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) > > > at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) > > > at dalvik.system.NativeStart.main(Native Method) > > > > Two: > > > "Binder Thread #4" prio=5 tid=17 NATIVE > > > | group="main" sCount=1 dsCount=0 s=N obj=0x432685c8 self=0x231ee8 > > > | sysTid=2690 nice=10 sched=0/0 handle=2315224 > > > at android.database.sqlite.SQLiteQuery.native_fill_window(Native > > Method) > > > at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75) > > > at > > android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288) > > > at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269) > > > at > > android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171) > > > at android.database.AbstractCursor.moveToNext(AbstractCursor.java:256) > > > at > > > com.newsrob.search.SearchProvider.getSuggestions(SearchProvider.java:80) > > > at com.newsrob.search.SearchProvider.query(SearchProvider.java:68) > > > at > > > android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:116) > > > at > > > android.content.ContentProviderNative.onTransact(ContentProviderNative.java:97) > > > at android.os.Binder.execTransact(Binder.java:287) > > > at dalvik.system.NativeStart.run(Native Method) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---