ref:
http://www.codedata.com.tw/mobile/android-tutorial-the-3rd-class-3-sqlite/
http://chihweiwu.blogspot.tw/2012/07/androidsqlite.html
搜尋此網誌
2015年1月6日 星期二
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
--------------------------------devide line----------------------------------------------------------------------
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.
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.
1
2
3
4
5
6
|
SQLiteDatabase db = new MyOpenHelper(context).getWritableDatabase();
try {
//DB operation
} finally {
db.close();
}
|
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.
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.
1
2
3
4
5
6
7
8
9
10
11
|
mOpenHelper = new MyOpenHelper(context);
・
・
db1 = mOpenHelper.getWritableDatabase();
・
・
db2 = mOpenHelper.getWritableDatabase();
・
・
// when both db1 and db2 no longer needed
mOpenHelper.close();
|
[Pattern 3]
If you want to use 「SQLiteDatabase」 object obtained from a 「SQLiteOpenHelper」 object in multi threads, you should use the 「aquireReference()」.
If you want to use 「SQLiteDatabase」 object obtained from a 「SQLiteOpenHelper」 object in multi threads, you should use the 「aquireReference()」.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
mOpenHelper = new MyOpenHelper(context);
・
・
//object used in main thread
mDb1 = mOpenHelper.getWritableDatabase();
・
・
//object used in another thread
mDb2 = mOpenHelper.getWritableDatabase();
mDb2.acquireReference();
new Thread(new Runnable() {
public void run() {
//DB operation
mDb2.close();
}
}).start();
・
・
mDb1.close(); // or mOpenHelper.close();
|
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]
[Relative Article]
You should close SQLiteDatabase in Android developing (1) | DeVlog
You should close SQLiteDatabase in Android developing (1) | DeVlog
訂閱:
文章 (Atom)