2013-06-01 1 views
0

Похожие вопросы об этом конкретном сообщении об ошибке были заданы несколько раз в Stack Overflow. Я не мог найти тот, который соответствует моей ситуации. Итак, вот оно.Завершение курсора, который не был деактивирован или закрыт Ошибка в классе запросов поставщика контента

Я получаю эту ошибку в методе query поставщика контента, когда включаю строгий режим. Метод запросов моего поставщика контента вызывает queryDirections(...). Я просто вызываю метод db.query и возвращаю курсор. Как я могу закрыть этот курсор? Компилятор жалуется на оператор возврата строки ниже, что курсор не закрыт. Подробное сообщение об ошибке приведено ниже. спасибо.

Content Provider

private Cursor queryDirections(Uri uri, String[] columns, 
     String selection, String[] selectionArguments, 
     String sortOrder) { 
      SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 
      return db.query(C.Db.TABLE_DIRECTIONS, columns, 
        selection, selectionArguments, null, null, sortOrder); 
    } 

Вызывается из деятельности

continued... 
case R.id.spinnerStops: 
    AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver()) { 
     @Override 
     protected void onQueryComplete(int token, Object cookie, Cursor stopCursor) { 
      stopCursor.moveToFirst(); 
      int columnIndex = stopCursor.getColumnIndex(Stop.KEY_TAG); 
      if (stopCursor.getCount() > 0) { 
       mStopTag = stopCursor.getString(columnIndex); 
       stopCursor.close(); 
      } 
     }; 
    }; 
    handler.startQuery(1, null, C.ContentUri.STOP, 
          new String[] { 
           C.Db.TABLE_STOPS + "." + Stop.KEY_TITLE, 
           C.Db.TABLE_STOPS + "." + Stop.KEY_TAG }, 
         "Stops._id=" + id, null, null); 
    break; 

Также я переопределен OnStop для моих двух вращающихся переходников

@Override 
protected void onStop() { 
    MyLogger.log("closing cursor"); 
    try { 
     if (mStopsAdapter != null) { 

      mStopsAdapter.getCursor().close(); 
      mStopsAdapter = null; 
     } 
     if (mDirectionAdapter != null) { 
      mDirectionAdapter.getCursor().close(); 
      mDirectionAdapter = null; 
     } 
    } catch (Exception e) { 
    } 
    super.onStop(); 

} 

ErrorMessage

05-31 23:30:23.295: E/StrictMode(28918): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.thuptencho.torontotransitbus/databases/appdb.db, table = directions, query = SELECT tag FROM directions WHERE _id=-999 
05-31 23:30:23.295: E/StrictMode(28918): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:98) 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:50) 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) 
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200) 
05-31 23:30:23.295: E/StrictMode(28918): at com.thuptencho.torontotransitbus.provider.TheContentProvider.queryDirections(TheContentProvider.java:169) 
05-31 23:30:23.295: E/StrictMode(28918): at com.thuptencho.torontotransitbus.provider.TheContentProvider.query(TheContentProvider.java:109) 
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentProvider.query(ContentProvider.java:652) 
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentProvider$Transport.query(ContentProvider.java:189) 
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentResolver.query(ContentResolver.java:372) 
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentResolver.query(ContentResolver.java:315) 
05-31 23:30:23.295: E/StrictMode(28918): at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:79) 
05-31 23:30:23.295: E/StrictMode(28918): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-31 23:30:23.295: E/StrictMode(28918): at android.os.Looper.loop(Looper.java:137) 
05-31 23:30:23.295: E/StrictMode(28918): at android.os.HandlerThread.run(HandlerThread.java:60) 
+0

Если вы хотите опубликовать свой код, где используется 'Cursor', это может помочь определить, где должен быть добавлен тип вызова cursor.close(). – ianhanniballake

+0

Я отредактировал для добавления кода, связанного с вызовом 'ContentResolver'. – Thupten

ответ

0

Cursor сек возвращается из ContentProvider должен быть закрыт принимающим компонентом (Activity, Service и т.д.), а не самим ContentProvider.

+0

и как вы это делаете в контексте предложений по поиску? – axd

+0

@axd - предполагая, что вы имеете в виду [пользовательские поисковые предложения] (http://developer.android.com/guide/topics/search/adding-custom-suggestions.html), которые должны позаботиться о своем собственном курсоре. – ianhanniballake

+0

, это как раз моя проблема ... рамки НЕ закрывают курсор, и я узнал через Strict. – axd

Смежные вопросы