SQLiteDatabase и курсоры - PullRequest
       27

SQLiteDatabase и курсоры

5 голосов
/ 27 марта 2011

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

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 () простодо возврата заявления.Однако это привело к тому, что возвращаемый курсор не содержал строк.Почему это так?

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

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

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

1 Ответ

9 голосов
/ 27 марта 2011

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

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

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

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

...