Dear Fellow Android Developers!
EDIT:
Thank you all for your answers. I see from many of them that it seems to be common (and accepted) practice to write your own close() method in your database adapter. Fair enough.
But how does that work with a ContentProvider? Usually when querying my database through my ContentProvider I simply issue something like:
Cursor managedCursor = managedQuery(...);
I don’t see how I, with this methodology, can access the custom close() method in my custom ContentProvider implementation. Should I instead, from my Activity, do something like:
MyCustomProvider myProvider = (MyCustomProvider) getContentResolver();
and then:
myProvider.query(...);
myProvider.close();
And above all; is this at all necessary (as of point 2 below)?
END EDIT
To a certain degree I must say that I get the concept of the SQLiteOpenHelper, what it is, how it’s used and so. I even use it on a regular basis when I write my own ContentProvider‘s.
The thing is that I’m not sure what to do with the SQLiteDatabase object, returned by the myOpenHelper.getWritableDatabase() (or the myOpenHelper.getReadableDatabase() function for what matters) when I’m done with it.
According to Android ContentProvider.onCreate() documentation:
You should defer nontrivial initialization (such as opening, upgrading, and scanning databases) until the content provider is used (via
query(Uri, String[], String, String[], String),insert(Uri, ContentValues), etc).[…]
If you do use
SQLiteOpenHelper, make sure to avoid callinggetReadableDatabase()orgetWritableDatabase()from this method. (Instead, overrideonOpen(SQLiteDatabase)to initialize the database when it is first opened.)
The above gives me a hint where to initialize the database (the query(...), insert(...), etc functions), but it doesn’t tell me anything on how to treat the created SQLiteDatbase object when I’ve finished using it.
-
Should I save it as a member variable of my
ContentProviderimplementation (and treat it much like a “private singleton” for future use)? -
Should I just leave it when exiting the
query(...),insert(...), etc. functions and trust that theSQLiteOpenHelperwill manage it for me in future calls? -
[Insert your alternative point-of-view here]
Being the confiding (or lazy) developer I’ve implemented my code according to the second alternative above. But I can’t get rid of the creepy feeling that I’m neglecting something important.
It depends on what you’re doing with your database. If you just do an insert, delete or select where you get an business object back, then you can close the database right after using it. As far as I know it is designed that you simply close it and request a new one when ever you need it.
But be careful when you’re working with a cursor then you have to keep the database open as long as the cursor is in use. Otherwise the application will crash when the cursor has to reload data.