Android: курсор не закрывается - PullRequest
2 голосов
/ 18 апреля 2011

В настоящее время у меня есть база данных, которая в цикле проверяет таблицу, существует ли случайное значение, а затем добавляет ее, если ее нет. Если случайное значение существует, оно просто получает новое случайное значение и пытается снова. Он делает это 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)

Ответы [ 2 ]

4 голосов
/ 11 октября 2012

Используйте getActivity().startManagingCursor(cursor); сразу после инициализации Cursor, если вы используете Cursor в своей деятельности, startManagingCursor (курсор) будет управлять вашим курсором, и cursor.close() в классе Db Adapter, если вы используете Cursor в классе DB.1003 *

2 голосов
/ 18 апреля 2011

Если исключение выдается в методе 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...