2011-03-27 33 views
5

我想知道如果有人可以給我一個Android遊標的簡要概述。一對夫婦的具體問題:SQLiteDatabases和光標

1 - 我有一個數據庫查詢後返回遊標的方法:只要return語句之前

public static Cursor getVehicles() 
{ 
    SQLiteDatabase db = vehicleData.getReadableDatabase(); 
    Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY); 

    return cursor; 
} 

爲了做家政,我想db.close() 。但是,這導致返回的遊標不包含任何行。爲什麼是這樣?

2 - 關閉遊標和關閉數據庫有什麼區別?

3 - 如果它是一個局部變量,或者我可以將它留給垃圾收集器清理,我需要在Cursor上調用close嗎?

4 - 我的數據庫很小,只能用於我的應用程序 - 我可以保持打開嗎?

回答

9

1)遊標只是指向查詢返回的數據的指針,它不包含查詢中的所有數據。這是爲了提高性能/效率(一次不會讀取大型結果集 - >使用較少的內存)。因此,如果關閉數據庫,則光標無法檢索數據 - >它是空的。當你關閉一個遊標時,所有相關的資源被釋放 - >你不能訪問與這個遊標相關的數據(因爲它已經被釋放),但是你可以使用這個遊標或其他遊標進行新的查詢。當你關閉一個數據庫時,你不能再查詢它(直到你重新打開它)。

3)總是關閉遊標。否則,你會遇到問題 - 如果遊標未關閉並且新查詢被阻止,則GC將會投訴。

4)如果你關閉它,當你的應用程序完成,是的。

+0

謝謝Alibi。關於4 - 有沒有辦法檢測應用程序何時結束? – barry 2011-03-27 17:13:47

+0

只要您的活動到期時關閉數據庫。你可以使用onDestroy方法。 http://www.outofwhatbox.com/blog/2010/12/android-closing-those-database-objects/ – alibi 2011-03-27 17:21:28

+0

它應該是onPause() - 文檔說我們不能依靠onDestroy()被調用。 – barry 2011-03-27 17:27:40