2011-08-17 60 views
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'有效關閉了相同的數據庫。

回答

2

您確實需要關閉它。數據庫在您明確關閉它之前不會關閉所有活動的遊標都已關閉。

+1

堆棧跟蹤顯示關閉遊標也嘗試關閉數據庫。在這種情況下,關閉數據庫不是必需的。請提一下,如果我在這裏錯過了一些觀點。 – PushpRaj

+1

我剛纔說了你錯過了什麼。 :/您還需要關閉數據庫。如果數據庫尚未被您明確關閉(並且只是在實際關閉之前等待所有未完成的遊標被關閉),它將不會在您查看的位置關閉。 – hackbod

+0

根據我所看到的,如果試圖關閉數據庫然後關閉遊標,將會出現以下異常:'由於連接池已關閉,無法執行此操作。所以它不會等待光標。 – ElyashivLavi