2011-02-11 6 views
12

Google의 메모장 예에서 적어도 onDestroy()에는 데이터베이스를 닫지 않는 것으로 보입니다.데이터베이스를 닫는 것이 필수적입니까?

폐쇄 목적은 무엇이며, 실제로해야합니까? 열린 데이터베이스가 상당한 메모리를 차지합니까? 나는 onDestroy에서 그것을 닫으면 액티비티가 끝난 후에 액티브 스레드를 실행하려고하는 스레드가 있으면 취약점을 남기는 것으로 나타났습니다.

+0

내 대답이 받아 들여지지 않고 받아 들여지지 않았습니까? – Farray

+0

나는 내 휴대폰에서 그것을 받아들이려고했다. 나는 안드로이드 브라우저에서이 사이트가 약간 버그가 있다고 생각한다. – Tenfour04

답변

10

데이터베이스 연결을 닫지 않으면 시간이 지남에 따라 메모리 누수가 발생합니다.

메모장 예제는 startManagingCursor을 사용하지만 명시 적으로 db 연결을 닫아야합니다. 메모장 예제를있는 그대로 실행하고 여러 노트를 연속적으로 편집하면 LogCat에서 경고 및 오류가 발생하기 시작합니다. (더 큰 애플리케이션에서, 당신은 또한 메모리 누수 탐지 경고를보고 시작합니다.) 당신은 onDestroy()에 닫을 여전히 실행중인 비 UI 스레드에서 "취약점을 남긴다"고 언급

W/SQLiteCompiledSql( 302): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: INSERT INTO notes(body, title) VALUES(?, ?); 
W/SQLiteCompiledSql( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
W/SQLiteCompiledSql( 302):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62) 
... 
W/SQLiteCompiledSql( 302):  at dalvik.system.NativeStart.main(Native Method) 
E/Database( 302): close() was never explicitly called on database '/data/data/com.android.demo.notepad3/databases/data' 
E/Database( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
E/Database( 302): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810) 
... 
E/Database( 302): at dalvik.system.NativeStart.main(Native Method) 

. AsyncTask를 사용하는 경우 작업에서 getStatus을 사용하여 이러한 스레드의 상태를 확인할 수 있습니다.

if (myAsyncTask.getStatus() == AsyncTask.Status.FINISHED){ 
    mDbHelper.close(); 
} 

는 그런 다음 AsyncTaskonPostExecute 방법에서 연결을 닫습니다.

도움이 되길 ...

+1

와우 .. 나는 Google의 자신의 예제가 최적의 코드를 사용하지 않을 것이라고 생각하지 않았습니다! – John

+0

커서를 안전하게 닫기 전에 DB를 닫을 수 있습니까? 감사. – Tenfour04

+0

@ TenFour04 - 아니요. DB를 닫은 후 커서에 액세스하려고하면 적합하다고 나타납니다. 그것이 UI 스레드에 없다면, 나는 그것이 응용 프로그램을 충돌 믿지 않아요 -하지만 여전히 나쁜 형태입니다. – Farray

0

닫아야합니다.

메모장 예제는 ActivitystartManagingCursor을 사용해야합니다.

+4

커서를 처리하지만 SQLiteDatabase 객체는 무엇입니까? – Tenfour04

관련 문제