Android: мне нужно закрыть объекты курсора?

В моем классе адаптера базы данных у меня есть много способов:

public long getContactId(final String phoneNumber) throws SQLException { final Cursor cur = mDb.rawQuery( "select contact_id from contactphones where number=? limit 1;", new String[] { phoneNumber }); return cur.moveToFirst() ? cur.getLong(0) : -1; } 

Я ценю краткость такого метода. Но я не называю Cursor.close (), и я не уверен, что это проблема или нет. Будет ли курсор закрыт и его ресурсы будут освобождены в Cursor.finalize ()? В противном случае мне пришлось бы делать:

 public long getContactId(final String phoneNumber) throws SQLException { final Cursor cur = mDb.rawQuery( "select contact_id from contactphones where number=? limit 1;", new String[] { phoneNumber }); final boolean retVal = cur.moveToFirst() ? cur.getLong(0) : -1; cur.close(); return retVal; } 

Да, рекомендуется закрыть курсор, когда вы закончите, используя этот объект курсора, чтобы курсор мог выполнять любую работу по дому, которую он хочет сделать после закрытия.

Курсор – это не класс, а интерфейс. Если ваш объект Cursor является SQLite-запросом, это SQLiteCursor. В этом определении (\Android\android-sdk\source\android\database\sqlite\SQLiteCursor.java) close() вызывается в функции finalize() . Это может быть другим в других типах курсоров, поскольку интерфейс Cursor не определяет это поведение.

Не закрывайте базу данных. Нет необходимости (данные будут безопасно записаны в постоянное хранилище при первой же возможности). Откройте его один раз, при запуске приложения и повторное использование одного и того же соединения в течение всей жизни приложения

Пожалуйста, перейдите по этой ссылке