Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When should I call close() on SQLiteOpenHelper used by ContentProvider

In my android app, I use SQLiteOpenHelper to implements ContentProvider. Query, add, delete operations are all through ContentProvider.

But in one of my android phone(htc g13), I found *.db-wal file in directory /data/data/[package name]/databases. And the file size increate very fast when operating with ContentProvider. It occupied user RAM space too much.

It is recommended to close the SQLiteOpenHelper to solve my problem (it is useful) in post enter link description here.

But I want to find a "place" to add the "close()" method since I am not using SQLiteOpenHelper directly (using through ContentProvider). query() method in ContentProvider must return a Cursor, and SQLiteDatabse should stay in open state.

I'm confused, what show I do now to keep *.db-wal gone and use ContentProvider normally?

like image 457
cmoaciopm Avatar asked Dec 16 '11 07:12

cmoaciopm


People also ask

When should a SQLite database be closed?

The SQLite connection object remains open until you close it using the close function. Always close this object when you finish using it.

Which of the following must be overridden while using SQLiteOpenHelper class?

SQLiteOpenHelper provides callback methods and we should override it to get our job done. Those callback methods that we can override are onCreate(), onUpgrade(), onOpen() and onDowngrade(). And onCreate() and onUpgrade() are abstract methods and must be overridden.

What is the use of onUpgrade function in SQLiteOpenHelper?

onUpgrade. Called when the database needs to be upgraded. The implementation should use this method to drop tables, add tables, or do anything else it needs to upgrade to the new schema version. The SQLite ALTER TABLE documentation can be found here.


2 Answers

Android framework engineer defer to this view that you need to close the DB.

As per Dianne Hackborn(Android Framework Engineer) in this thread:

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.

like image 177
Tarun Avatar answered Oct 12 '22 23:10

Tarun


You have a couple of cases to cover:

1) When your application finishes (e.g. entering onDestroy()) make sure you close all Cursors, Database instances of SQLiteDatabase and SQLiteOpenHelpers (using the model if (connection.isOpen()) object.close())

2) When you application goes onPause() -> onResume() - use this stages appropriately to pause/resume your connection or to close/open them.

It's a good practice to close your database immediately after you finish working with it. The database is cached, so there's no problem closing it and re-acquire instance again when you need it with getWritableDatabase()/getReadableDatabase()

From the official doc: "Once opened successfully, the database is cached, so you can call this method every time you need to write to the database. (Make sure to call close() when you no longer need the database.)"

Also keep in mind that if SQLiteOpenHelper caches and tracks all open instances of SQLiteDatabase, it basically means that if you don't leave open database connections, you won't have to call close on SQLiteOpenHelper.

I recommend closing all cursors and databases immediately after you stop working with them. Always try to enforce try/catch/ for queries operations and a "finally block" to call the close methods on the objects.

like image 24
hovanessyan Avatar answered Oct 12 '22 23:10

hovanessyan