[英]SQLite When should I close the db and cursor? Should I use asynchronous invocation?
這個問題是對此的后續問題:
我正在學習如何在Android上使用SQLite,並以本教程為例:
http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
我看不到關閉數據庫或游標時的任何一致性。 例如,有一個關閉數據庫的方法:
public void addContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName()); // Contact Name
values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
db.close(); // Closing database connection
}
但是緊隨其后的是沒有關閉此方法的方法:
public Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
// return contact
return contact;
}
關閉游標也一樣。
為什么添加聯系人后關閉數據庫而不獲取聯系人后關閉數據庫是正確的? 在調用getWritableDatabase()
或getReadableDatabase()
之后始終關閉數據庫是一種好習慣嗎? 另外,如果我想向數據庫中添加多個項目,是保持與數據庫的連接打開並一個接一個地插入許多項目的一種好習慣,還是我應該通過一個查詢以某種方式將它們全部插入?
我還讀過您想使用AsyncTask
或IntentService
調用getWritableDatabase()
或getReadableDatabase()
的方法,但是本教程中的方法按IntentService
使用它。 哪個更好的做法?
是的,應始終在使用后關閉數據庫連接。
可寫的數據庫連接更容易受到攻擊,因為某些其他進程可能會訪問未關閉的數據庫連接並更改數據庫。 他們無法通過未封閉的可讀數據庫連接來做到這一點。
內存泄漏應最小化。 我昨天剛剛回答了類似的問題。 這里是 :
Java中的內存泄漏是一種情況,其中某些對象不再被應用程序使用,但是垃圾回收無法將其識別為未使用,因此不會清除它。
每次創建對象時,都會為該對象保留一些內存空間。 對於任何數據庫連接也是如此。 因此,在使用連接后,如果您不關閉它,GC將不會知道該對象將不再使用,因此不會刪除它。 因此,它保留在內存中,在程序其余部分運行時會消耗寶貴的資源。 [因此資源泄漏]。
這根本不是所希望的。 此外,由於連接打開,容易受到攻擊並且可以對數據庫進行更改,因此這使您的程序面臨安全問題。 請記住,即使活動關閉后,如果有正在運行的線程或AsyncTask,數據庫連接也將與線程一起保持打開狀態。
延伸閱讀: 什么是Java中的“內存泄漏”?
從StackOverflow: 關閉數據庫連接以避免內存泄漏
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.