Android SQLiteOpenHelper close()从未被显式调用

Android SQLiteOpenHelper close()从未被显式调用,android,sqliteopenhelper,Android,Sqliteopenhelper,安卓2.3.3 我的应用程序中有两个活动可以访问数据库。无论何时我改变手机的方向,我都会在logcat中得到以下错误,尽管程序确实有效。我从错误中了解到,我必须调用close()并关闭数据库和游标。但我该把它确切地放在哪里呢 关闭活动的onDestroy()中的数据库和游标可以解决问题吗 Database pm; Cursor c; @Override public void onDestroy() { pm.close();

安卓2.3.3

我的应用程序中有两个活动可以访问数据库。无论何时我改变手机的方向,我都会在logcat中得到以下错误,尽管程序确实有效。我从错误中了解到,我必须调用
close()
并关闭数据库和游标。但我该把它确切地放在哪里呢

关闭活动的
onDestroy()
中的数据库和游标可以解决问题吗

    Database pm;
        Cursor c;

    @Override
        public void onDestroy() {
          pm.close();
          c.close();
          // Any other cursors that are used...

            super.onDestroy();
    }
这是必要的logcat跟踪

02-16 22:37:50.419: E/Database(602): close() was never explicitly called on database 'portfolio' 
02-16 22:37:50.419: E/Database(602): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
02-16 22:37:50.419: E/Database(602):    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
02-16 22:37:50.419: E/Database(602):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:822)
02-16 22:37:50.419: E/Database(602):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:856)
02-16 22:37:50.419: E/Database(602):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:849)
02-16 22:37:50.419: E/Database(602):    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:553)
02-16 22:37:50.419: E/Database(602):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-16 22:37:50.419: E/Database(602):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
02-16 22:37:50.419: E/Database(602):    at com.xx.xxx.Database.<init>(Database.java:21)
02-16 22:37:50.419: E/Database(602):    at com.xx.xxx.Brokerage_Settings.onCreate(Brokerage_Settings.java:118)
02-16 22:37:50.419: E/Database(602):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-16 22:37:50.419: E/Database(602):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
02-16 22:37:50.419: E/Database(602):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
02-16 22:37:50.419: E/Database(602):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-16 22:37:50.419: E/Database(602):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
02-16 22:37:50.419: E/Database(602):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-16 22:37:50.419: E/Database(602):    at android.os.Looper.loop(Looper.java:130)
02-16 22:37:50.419: E/Database(602):    at android.app.ActivityThread.main(ActivityThread.java:3687)
02-16 22:37:50.419: E/Database(602):    at java.lang.reflect.Method.invokeNative(Native Method)
02-16 22:37:50.419: E/Database(602):    at java.lang.reflect.Method.invoke(Method.java:507)
02-16 22:37:50.419: E/Database(602):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
02-16 22:37:50.419: E/Database(602):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
02-16 22:37:50.419: E/Database(602):    at dalvik.system.NativeStart.main(Native Method)
02-16 22:37:50.419:E/Database(602):从未对数据库“portfolio”显式调用close()
02-16 22:37:50.419:E/Database(602):android.Database.sqlite.DatabaseObjectNotClosedException:应用程序未关闭在此打开的光标或数据库对象
02-16 22:37:50.419:E/Database(602):位于android.Database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1849)
02-16 22:37:50.419:E/Database(602):在android.Database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:822)
02-16 22:37:50.419:E/Database(602):在android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:856)
02-16 22:37:50.419:E/Database(602):在android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:849)
02-16 22:37:50.419:E/Database(602):位于android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:553)
02-16 22:37:50.419:E/Database(602):位于android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-16 22:37:50.419:E/Database(602):在android.Database.sqlite.SQLiteOpenHelper.getwriteabledatabase(SQLiteOpenHelper.java:118)
02-16 22:37:50.419:E/Database(602):位于com.xx.xxx.Database.(Database.java:21)
02-16 22:37:50.419:E/Database(602):在com.xx.xxx.Brokerage\u Settings.onCreate(Brokerage\u Settings.java:118)
02-16 22:37:50.419:E/数据库(602):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-16 22:37:50.419:E/数据库(602):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
02-16 22:37:50.419:E/数据库(602):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
02-16 22:37:50.419:E/数据库(602):在android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-16 22:37:50.419:E/数据库(602):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
02-16 22:37:50.419:E/Database(602):在android.os.Handler.dispatchMessage(Handler.java:99)上
02-16 22:37:50.419:E/数据库(602):在android.os.Looper.loop(Looper.java:130)上
02-16 22:37:50.419:E/数据库(602):位于android.app.ActivityThread.main(ActivityThread.java:3687)
02-16 22:37:50.419:E/数据库(602):位于java.lang.reflect.Method.invokenactive(本机方法)
02-16 22:37:50.419:E/Database(602):在java.lang.reflect.Method.invoke(Method.java:507)
02-16 22:37:50.419:E/Database(602):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
02-16 22:37:50.419:E/数据库(602):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
02-16 22:37:50.419:E/数据库(602):在dalvik.system.NativeStart.main(本机方法)

关闭数据库和光标对象的最佳做法是什么

在onPause()中调用close。当你改变手机的方向时,你的应用程序会改变状态,你应该在android系统调用super.onPause()之前关闭数据库/光标对象。在命令super.onPause()之前调用close-in-onPause方法。

您会遇到什么错误?使用logcat trace更新了问题。@vamsichilla
onPause()是更好的地方。
我通常会在您使用它的函数中打开和关闭db和光标。因此,当您点击onDestroy时,所有内容都应该已经关闭。