2011-08-17 34 views
5

Từ mã nguồn của SQLiteCursor (stack trace):android: sao chúng ta cần phải đóng Db sau khi đóng con trỏ

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) 

Liệu nó có nghĩa rằng, đóng con trỏ cuối cùng cũng sẽ đóng cửa cơ sở dữ liệu. Và chúng tôi không cần phải đóng nó một cách rõ ràng, như trong mã này:

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(); 
     } 
    } 

vì vậy ở đây, chúng tôi không cần phải đóng rdb?

lưu ý: đối tượng con trỏ giữ tham chiếu đến cơ sở dữ liệu, do đó, nó nhận được khóa trên cùng một truy vấn. Do đó 'SQLiteDatabse.dbclose' có hiệu quả đóng cùng một cơ sở dữ liệu.

Trả lời

2

Bạn cần đóng nó. Cơ sở dữ liệu sẽ không bị đóng cho đến khi bạn đóng một cách rõ ràng nó tất cả các con trỏ đang hoạt động đã bị đóng.

+1

theo dõi ngăn xếp cho thấy con trỏ đóng cũng cố gắng đóng cơ sở dữ liệu. trong một kịch bản như vậy, việc đóng DB không cần thiết. Xin vui lòng đề cập đến nếu tôi thiếu một số điểm ở đây. – PushpRaj

+1

Tôi chỉ nói những gì bạn đang thiếu. :/Bạn cũng cần phải đóng cơ sở dữ liệu. Nó sẽ không được đóng lại tại thời điểm bạn đang xem tại đây nếu cơ sở dữ liệu chưa được bạn đóng một cách rõ ràng (và chỉ đợi tất cả các con trỏ xuất sắc được đóng trước khi thực sự tắt). – hackbod

+0

Từ những gì tôi thấy, Nếu bạn cố gắng đóng cơ sở dữ liệu và sau đó đóng con trỏ, bạn sẽ nhận được ngoại lệ sau: 'Không thể thực hiện thao tác này vì kết nối đã đóng. '. Vì vậy, nó sẽ không chờ đợi cho con trỏ. – ElyashivLavi

Các vấn đề liên quan