2012-06-21 2 views
0

SQLite DB를 올바르게 닫을 수있는 방법에 문제가 있습니다.
응용 프로그램을 실행할 때 활동 중 하나가 내 DBAdapter 클래스를 사용하여 내 DB에서 정보 행을 검색 한 다음 사용자가 뒤로 버튼을 누르거나 응용 프로그램을 닫으면 문제를 피하기 위해 즉시 닫고 싶습니다.sqite 데이터베이스를 닫을 때 문제가 발생했습니다.

하지만 동일한 DB 및 어댑터를 사용하는 다른 활동으로 전환하면 오류가 발생합니다. 여기

는 활동 수준 코드 :

PlayerSummonDbAdapter PlayerDbAdapter; 
PlayerDbAdapter = new PlayerSummonDbAdapter(this); 
PlayerDbAdapter.open(); 
     mySummon = new Summon(); 
     mySummon = PlayerDbAdapter.retrieveSummon(1, summonName); 
PlayerDbAdapter.close(); 

그리고 여기 내 어댑터 open()lose() 방법입니다 :의 샘플 여기

public PlayerSummonDbAdapter open() throws SQLException { 
     dbHelper = new PlayerSummonSQLiteHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     return this; 
} 
public void close() { 
     database.close(); 
     dbHelper.close(); 
    } 

된다 오류 로그 : 데이터베이스에 close()가 호출되지 않았 음을 나타냅니다.하지만 그걸 닫습니다. 적어도 내가 한 것 같아.

06-21 00:10:35.928: I/dalvikvm(23203): Uncaught exception thrown by finalizer (will be discarded): 
06-21 00:10:35.928: I/dalvikvm(23203): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on Moves that has not been deactivated or closed 
06-21 00:10:35.928: I/dalvikvm(23203): at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:620) 
06-21 00:10:35.928: I/dalvikvm(23203): at dalvik.system.NativeStart.run(Native Method) 
06-21 00:10:35.932: E/Database(23203): close() was never explicitly called on database '/mnt/sdcard/Summon.sqlite' 
06-21 00:10:35.932: E/Database(23203): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
06-21 00:10:35.932: E/Database(23203): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
06-21 00:10:35.932: E/Database(23203): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
06-21 00:10:35.932: E/Database(23203): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
06-21 00:10:35.932: E/Database(23203): at com.willmer.SummonListAdapter.open(SummonListAdapter.java:55) 
06-21 00:10:35.932: E/Database(23203): at com.willmer.BattleActivity.onCreate(BattleActivity.java:78) 
06-21 00:10:35.932: E/Database(23203): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-21 00:10:35.932: E/Database(23203): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
06-21 00:10:35.932: E/Database(23203): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
06-21 00:10:35.932: E/Database(23203): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
06-21 00:10:35.932: E/Database(23203): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
06-21 00:10:35.932: E/Database(23203): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-21 00:10:35.932: E/Database(23203): at android.os.Looper.loop(Looper.java:130) 
06-21 00:10:35.932: E/Database(23203): at android.app.ActivityThread.main(ActivityThread.java:3688) 
06-21 00:10:35.932: E/Database(23203): at java.lang.reflect.Method.invokeNative(Native Method) 
06-21 00:10:35.932: E/Database(23203): at java.lang.reflect.Method.invoke(Method.java:507) 
06-21 00:10:35.932: E/Database(23203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
06-21 00:10:35.932: E/Database(23203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
06-21 00:10:35.932: E/Database(23203): at dalvik.system.NativeStart.main(Native Method) 
06-21 00:10:35.944: E/Database(23203): close() was never explicitly called on database '/data/data/com.willmer/databases/PlayerSummons.db' 
06-21 00:10:35.944: E/Database(23203): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
06-21 00:10:35.944: E/Database(23203): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
06-21 00:10:35.944: E/Database(23203): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
06-21 00:10:35.944: E/Database(23203): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
06-21 00:10:35.944: E/Database(23203): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
06-21 00:10:35.944: E/Database(23203): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:635) 
06-21 00:10:35.944: E/Database(23203): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
06-21 00:10:35.944: E/Database(23203): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
06-21 00:10:35.944: E/Database(23203): at com.willmer.PlayerSummonDbAdapter.open(PlayerSummonDbAdapter.java:67) 
06-21 00:10:35.944: E/Database(23203): at com.willmer.BattleActivity.CaptureSummon(BattleActivity.java:563) 
06-21 00:10:35.944: E/Database(23203): at com.willmer.BattleActivity.onClick(BattleActivity.java:146) 
06-21 00:10:35.944: E/Database(23203): at android.view.View.performClick(View.java:2538) 
06-21 00:10:35.944: E/Database(23203): at android.view.View$PerformClick.run(View.java:9152) 
06-21 00:10:35.944: E/Database(23203): at android.os.Handler.handleCallback(Handler.java:587) 
06-21 00:10:35.944: E/Database(23203): at android.os.Handler.dispatchMessage(Handler.java:92) 
06-21 00:10:35.944: E/Database(23203): at android.os.Looper.loop(Looper.java:130) 
06-21 00:10:35.944: E/Database(23203): at android.app.ActivityThread.main(ActivityThread.java:3688) 
06-21 00:10:35.944: E/Database(23203): at java.lang.reflect.Method.invokeNative(Native Method) 
06-21 00:10:35.944: E/Database(23203): at java.lang.reflect.Method.invoke(Method.java:507) 
06-21 00:10:35.944: E/Database(23203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
06-21 00:10:35.944: E/Database(23203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
06-21 00:10:35.944: E/Database(23203): at dalvik.system.NativeStart.main(Native Method) 
+0

먼저 시도 ** mySummon ** –

답변

0

사용 된 커서를 닫지 않은 것처럼 보입니다.

참고 : 대부분의 문제를 처리하는 Android 용 지원 라이브러리에서 제공되는 더 우수한 API가 있습니다.

+0

오류 로그에서 분명합니까? 그렇다면 어떤 줄 이니, 이해가되면 다시 볼 수 있습니다. – willmer

+0

이것은 까다로운 문제입니다. 오래된 안드로이드 버전에는이 오류가 없었으며 메모리 누수가 발생했습니다. 그래서 Google은 커서의 최종자를 확인하여 네이티브 객체를 해제하고 개발자가 잊어 버린 것을 알 수 있도록 오류를 발생시킵니다. 로그의 처음 2 행을 확인하십시오. 오류는 닫는 것을 잊은 곳을 말하지 않습니다. 그것은 단지 커서가 마무리되고 있다고 말하고 있지만 기본 네이티브 객체를 해제하기 위해 닫히지 않았습니다. – Madushan

0

onDestroy에서 데이터베이스를 닫으십시오.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (dbHelper != null) { 
     database.close(); 
     dbHelper .close(); 
    } 
    } 
0

이 기본적으로 많이 제공하지만, 코드에 이것을 추가

  • 가까운 커서 즉시
  • 당신 돈 (아마 finally 블록) 사용 후 명시 적으로 데이터베이스를 닫을 필요가 없으므로 프로세스가 종료 될 때 자동으로 닫힙니다.

데이터베이스를 여는 데 약간의 오버 헤드가 있으므로 반복적으로 열거 나 닫는 것이 좋습니다. 데이터베이스 도우미를 싱글 톤으로 만들어 응용 프로그램 전체에서 사용하십시오. 앱에서 close() 메소드를 호출하지 마세요.

+0

나는 그 제안을 조사해야 할 것이다. – willmer

관련 문제