2013-05-20 104 views
4

我知道一個數據庫關閉後,光標變爲「無效」,這是否也同時關閉了光標?這是否避免了必須做下面顯示的內容?明確地關閉SQLite數據庫中的遊標,需要還是不需要?

例如1

public void String getResultsAndReturnString() { 
     String result = ""; 
     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     Cursor cursor = qb.query(db, projection, null, null, 
        null, null, null); 
     cursor.close(); <-- explicit cursor close example one 
     db.close(); 
    return result; 
    } 

例如2

public void Cursor getResultsAndReturnCursor(){ 
    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    Cursor cursor = qb.query(db, projection, null, null, 
        null, null, null); 
    return cursor; 
} 

public void closeOut(Cursor cursor, SQLiteDatabase dataBase){ 
    cursor.close(); <-- explicit cursor close example two 
    dataBase.close(); 
} 

回答

5

光標不會被關閉數據庫(它仍然存在,你可以在上面進行操作),在嚴格意義上封閉的,但如你所知,關閉數據庫會使光標變得無用。你應該在完成使用後明確關閉遊標,原因如下:

1)正如你所說的,在關閉數據庫之後,任何剩餘的遊標變得「無效」,並且不能依賴準確的數據;

2)您將在LogCat中看到警告; 3)如果你保持對遊標的引用,你就會冒內存泄漏的風險;和

4)這是一個很好的編程習慣來關閉你不再需要的資源。

+0

遊標如何映射到系統資源?什麼是db實例本身呢?我相信db是映射的os資源,但不能確定遊標。關閉遊標試圖關閉底層數據庫(可能會或可能不會成功),那麼這裏的邏輯是什麼?有任何想法嗎? – zgulser

+0

@zgulser我認爲關於「[c]丟失遊標嘗試關閉底層數據庫」的斷言是不正確的。遊標是數據庫的一組離散結果,而不是數據庫本身。因此,關閉遊標對數據庫沒有影響。 – MarsAtomic

+0

嗨,這就是我在堆棧跟蹤中看到的原因。儘管如此,它並不一定會關閉 - 它只是試圖按照我的理解關閉它。此外,總是建議在關閉db之前進行空檢查,我懷疑這個斷言可能是原因。 – zgulser

相關問題