5
從SQLiteCursor(堆棧跟蹤)的源代碼後,關閉Db的:安卓:我們需要關閉遊標
at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)
at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:325)
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)
at android.database.sqlite.SQLiteProgram.onAllReferencesReleased(SQLiteProgram.java:119)
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)
at android.database.sqlite.SQLiteProgram.close(SQLiteProgram.java:296)
at android.database.sqlite.SQLiteQuery.close(SQLiteQuery.java:136)
at android.database.sqlite.SQLiteCursor.close(SQLiteCursor.java:506)
這是否意味着,關閉最後一個光標也將關閉數據庫。並且我們不需要明確地關閉它,如在此代碼中:
SQLiteDatabase rdb = db.getReadableDatabase();
Cursor resultCursor = null;
String patternQuery = SQLiteQueryBuilder.buildQueryString(true, "Store", columns, where, null, null, null, null);
try
{
resultCursor = rdb.rawQuery(patternQuery, null);
resultCursor.moveToFirst();
if (resultCursor.getCount() > 0)
{
while (!resultCursor.isAfterLast())
{
result.add(resultCursor.getString(0));
resultCursor.moveToNext();
}
}
}
catch (Exception e)
{
Log.d("DB", "Caught an exception while getting pattern based results: " + e);
}
finally
{
if (resultCursor != null)
{
resultCursor.close();
}
if (rdb.isOpen())
{
rdb.close();
}
}
所以在這裏,我們不需要關閉rdb?
注意:遊標對象保留對數據庫的引用,所以它在每個查詢上獲得相同的鎖。因此'SQLiteDatabse.dbclose'有效關閉了相同的數據庫。
堆棧跟蹤顯示關閉遊標也嘗試關閉數據庫。在這種情況下,關閉數據庫不是必需的。請提一下,如果我在這裏錯過了一些觀點。 – PushpRaj
我剛纔說了你錯過了什麼。 :/您還需要關閉數據庫。如果數據庫尚未被您明確關閉(並且只是在實際關閉之前等待所有未完成的遊標被關閉),它將不會在您查看的位置關閉。 – hackbod
根據我所看到的,如果試圖關閉數據庫然後關閉遊標,將會出現以下異常:'由於連接池已關閉,無法執行此操作。所以它不會等待光標。 – ElyashivLavi