I had a exactly similar situation like yours. In addition to what you described, in my app the user also can update the database through input on the screen. The way I resolved it ( I don't know if it's the best way, but I hardly see any locking issue now)
- Make a singleton class derived from SQLiteOpenHelper to make sure only one instance is running at any given time.
- Implement ContentProvider class for insert/update/delete/query operations. Make all those functions 'synchronized'
- Only close the db in ContentProvider's shutdown function. I do a very frequent db operations, so I don't want to open/close everytime. But I am not sure if it's the correct way of handling it.
- Do access DB only through ContentProvider interface from anywhere