Android:光标未关闭

Android:光标未关闭,android,cursor,Android,Cursor,我目前有一个数据库,它在循环中检查一个表是否存在随机值,如果不存在,则添加它。如果随机值确实存在,它只会获取一个新的随机值并重试。它执行此操作36次,然后删除该表 我的代码如下: public void loop() { random(); //Simple RNG try{ id = db.getAllEntries(); Log.d(TAG, "ran = " + ran + "

我目前有一个数据库,它在循环中检查一个表是否存在随机值,如果不存在,则添加它。如果随机值确实存在,它只会获取一个新的随机值并重试。它执行此操作36次,然后删除该表

我的代码如下:

public void loop() {

            random(); //Simple RNG
            try{
                id = db.getAllEntries();
                Log.d(TAG, "ran = " + ran + " i = " + i + " id = " + id);
                db.getTest(ran);
                loop();
            }
            catch(Exception ex){
                populatePeices(ran); //Makes ImageButtons have images
            }

    }
我的数据库方法是:

public void getTest(int ran) {
    Cursor cursor = db.rawQuery("SELECT imageName FROM tblMusicHall WHERE imageName = " + ran, null);
    cursor.moveToNext();
    Log.d(TAG, "Cursor " + cursor.getString(0));
    cursor.close();
}
日志是用来实时观察过程的。问题是,当它抛出“游标未关闭”异常时,它是完全随机的。有时我会看着它通过所有36个迭代,而不是抛出一个。其他时候,它将遍历循环的所有36次迭代,然后抛出36个异常。我的脑子乱七八糟

我也尝试过使用startManagingCursor(),但我想自己控制光标

我继续收到的错误如下。如果有人有任何想法,请分享

04-18 07:59:04.280: ERROR/Cursor(31526): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.tallgrass.xxxxxxxxx/databases/xxxxxxxxxx,table = null, query = SELECT imageName FROM tblMusicHall WHERE imageName = 4
04-18 07:59:04.280: ERROR/Cursor(31526): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
04-18 07:59:04.280: ERROR/Cursor(31526):     at  android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.tallgrass.xxxxxxxx.DBAdapter.getTest(DBAdapter.java:135)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.tallgrass.xxxxxxxx.Play.loop(Play.java:45)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.tallgrass.xxxxxxxx.Play.onCreate(Play.java:31)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.widget.TabHost.setCurrentTab(TabHost.java:323)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.widget.TabHost.addTab(TabHost.java:213)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.tallgrass.xxxxxxxx.Main.onCreate(Main.java:36)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.os.Looper.loop(Looper.java:123)
04-18 07:59:04.280: ERROR/Cursor(31526):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-18 07:59:04.280: ERROR/Cursor(31526):     at java.lang.reflect.Method.invokeNative(Native Method) 04-18 07:59:04.280: ERROR/Cursor(31526):     at java.lang.reflect.Method.invoke(Method.java:521)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-18 07:59:04.280: ERROR/Cursor(31526):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-18 07:59:04.280: ERROR/Cursor(31526):     at dalvik.system.NativeStart.main(Native Method)
04-18 07:59:04.280:错误/光标(31526):结束尚未停用或关闭的光标。database=/data/data/com.tallgrass.xxxxxxxxx/databases/xxxxxxxxx,table=null,query=SELECT imageName FROM tblMusicHall,其中imageName=4
04-18 07:59:04.280:错误/光标(31526):android.database.sqlite.DatabaseObjectNotClosedException:应用程序未关闭在此打开的光标或数据库对象
04-18 07:59:04.280:错误/游标(31526):位于android.database.sqlite.SQLiteCursor.(SQLiteCursor.java:210)
04-18 07:59:04.280:ERROR/Cursor(31526):位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
04-18 07:59:04.280:错误/光标(31526):位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
04-18 07:59:04.280:错误/光标(31526):位于android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
04-18 07:59:04.280:错误/光标(31526):位于com.tallgrass.xxxxxxxx.DBAdapter.getTest(DBAdapter.java:135)
04-18 07:59:04.280:错误/光标(31526):位于com.tallgrass.xxxxxxxx.Play.loop(Play.java:45)
04-18 07:59:04.280:错误/光标(31526):位于com.tallgrass.xxxxxxxx.Play.onCreate(Play.java:31)
04-18 07:59:04.280:错误/光标(31526):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
04-18 07:59:04.280:错误/光标(31526):位于android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
04-18 07:59:04.280:错误/光标(31526):位于android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
04-18 07:59:04.280:错误/光标(31526):位于android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
04-18 07:59:04.280:错误/光标(31526):位于android.widget.TabHost.setCurrentTab(TabHost.java:323)
04-18 07:59:04.280:错误/光标(31526):位于android.widget.TabHost.addTab(TabHost.java:213)
04-18 07:59:04.280:错误/光标(31526):位于com.tallgrass.xxxxxxxx.Main.onCreate(Main.java:36)
04-18 07:59:04.280:错误/光标(31526):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-18 07:59:04.280:错误/光标(31526):位于android.os.Handler.dispatchMessage(Handler.java:99)
04-18 07:59:04.280:错误/光标(31526):位于android.os.Looper.loop(Looper.java:123)
04-18 07:59:04.280:错误/光标(31526):位于android.app.ActivityThread.main(ActivityThread.java:4627)
04-18 07:59:04.280:ERROR/Cursor(31526):在java.lang.reflect.Method.invokenactive(本机方法)04-18 07:59:04.280:ERROR/Cursor(31526):在java.lang.reflect.Method.invoke(Method.java:521)
04-18 07:59:04.280:ERROR/Cursor(31526):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-18 07:59:04.280:错误/光标(31526):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-18 07:59:04.280:错误/光标(31526):位于dalvik.system.NativeStart.main(本机方法)

如果在
getTest()方法中抛出异常,则光标可能未关闭。尝试将此方法更改为以下内容:

public void getTest(int ran) {
    Cursor cursor;
    try {
        cursor = db.rawQuery("SELECT imageName FROM tblMusicHall WHERE imageName = " + ran, null);
        cursor.moveToNext();
        Log.d(TAG, "Cursor " + cursor.getString(0));
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

使用
getActivity()
初始化游标之后,如果您在活动中使用游标,则startManagingCursor(游标)将管理您的游标,如果您在Db适配器类中使用游标,则在Db适配器类中关闭()

非常感谢!IDK这有什么不同,但它现在起作用了!编辑:事实上我现在明白了。当它在循环中运行时,它可能会在moveToNext()或getString()上抛出异常,但从未得到关闭它的更改。是的,你是对的。始终从
finally
部分调用
Cursor.close()等方法。它将帮助您避免资源泄漏。