SQLiteDatabases и курсоры

Мне было интересно, может ли кто-нибудь дать мне краткий обзор Android Cursors. Несколько конкретных вопросов:

1 – У меня есть метод, который возвращает курсор после запроса к базе данных:

public static Cursor getVehicles() { SQLiteDatabase db = vehicleData.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY); return cursor; } 

Чтобы сделать домашнее хозяйство, я попробовал db.close () непосредственно перед оператором return. Однако это привело к тому, что возвращаемый курсор не содержал строк. Почему это?

2 – В чем разница между закрытием курсора и закрытием базы данных?

3 – Нужно ли мне закрывать курсор, если это локальная переменная, или я могу оставить его сборщику мусора для очистки?

4 – Моя база данных небольшая и используется только моим приложением – могу ли я просто открыть ее?

    1) Курсор – это просто указатель на данные, возвращаемые вашим запросом, он не содержит всех данных из вашего запроса. Это повышает производительность / эффективность (большие результаты не считываются сразу -> меньше используемой памяти). Поэтому, если вы закроете базу данных, курсор не сможет получить данные -> он пуст.

    2) Когда вы закрываете курсор, все связанные ресурсы освобождаются -> вы не можете получить доступ к данным, связанным с этим курсором (поскольку он был выпущен), но вы можете создавать новые запросы с использованием этих или других курсоров. Когда вы закрываете базу данных, вы больше не можете ее запрашивать (пока вы ее не откроете).

    3) Всегда закрывайте курсоры. В противном случае вы столкнетесь с проблемами – GC будет жаловаться, если курсор не закрыт и новые запросы заблокированы.

    4) Если вы закрываете его, когда ваше приложение заканчивается, да.