搜尋此網誌

2015年1月5日 星期一

【Android】When should close SQLiteDatabase

ref:
http://www.devlog.en.alt-area.org/?p=1019
http://stackoverflow.com/questions/18595482/do-i-need-to-call-getwritabledatabase-everytime-i-manipulate-data

You should close every cursor you open. But the database instance doesn't need to be closed after each use.
I usually fetch a writable database in onCreate() and store the resulting SQLiteDatabase as a member variable for each activity, and never explicitly close that instance. (But again, I do close every cursor as soon as I'm finished processing their results.)
See Managing SQLite Connections in Android for a little more discussion on the subject.

--------------------------------devide line----------------------------------------------------------------------
「SQLiteOpenHelper」 may return the same 「SQLiteDatabase」 object. Based on this, I will describe how to execute close() properly.

「SQLiteOpenHelper」 returns the same 「SQLiteDatabase」 object

Before, in my article You should close SQLiteDatabase in Android developing (1) | DeVlog, I said you should close 「SQLiteDatabase」 object properly.
Then, I found that the objects obtained from 「SQLiteOpenHelper」 may be the same 「SQLiteDatabase」 object. That is, 「SQLiteOpenHelper」 object holds mDatabasefield which is the 「SQLiteDatabase」 object and returns it.

You can be addressed with the same idea

However, the way of action is almost same to [Pattern 1] – [pattern 3] of the previous article. You shoud close properly.
[Pattern 1]
Get one 「SQLiteDatabase」 object from one 「SQLiteOpenHelper」 object when you need it, and close it when you no longer need it. I take this style basically.
This is as a previous article.
By the way, even if you close a 「SQLiteDatabase」 object that is obtained from a SQLiteHelper object and then you get a 「SQLiteDatabase」 object from the same Helper opbject, there is no problem. In that case, new 「SQLiteDatabase」 object will be created.
[Pattern 2]
If you retrieve multiple objects from a single 「SQLiteOpenHelper」 in one thread, you should call close() at once when no longer needed. To do so, use 「SQLiteOpenHelper#close()」. It will close the 「SQLiteDatabase」 object inside.
[Pattern 3]
If you want to use 「SQLiteDatabase」 object obtained from a 「SQLiteOpenHelper」 object in multi threads, you should use the 「aquireReference()」.
db1 and db2 in [Pattern2] or mDb1 and mDb2 in [Pattern3] looks different each other, but are the same entity. Therefore, their handling is the same as when dealing with multiple references in the previous article.
[Reference Sites]
  1. SQLiteOpenHelper | Android Developers
  2. SQLiteDatabase | Android Developers

沒有留言: