При программировании на Android нужен ли курсор для извлечения простого значения только для чтения из SQLite? - PullRequest
0 голосов
/ 29 января 2011

Я из PHP, где никогда не использовал курсоры.

Я следовал примеру Google Android Notepad, где я практиковался в использовании курсоров и адаптеров баз данных.Я смутно понимаю, что смысл курсора в том, чтобы «помочь с действиями жизненного цикла, которые происходят в Android» или привести пример, «... который позволяет Android заботиться о жизненном цикле курсора, а не беспокоиться о нем».

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

Смысл приведенного ниже кода заключается в получении количества товаров в корзине.

public long getNumItemsInCart(Long rowId) throws SQLException {
        Cursor mCursor =
            mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NUM_ITEMS_IN_CART}, KEY_ROWID + "='" + rowId + "'", null,
                    null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor.getLong(mCursor.getColumnIndexOrThrow(ProductsDbAdapter.KEY_NUM_ITEMS_IN_CART));        
    }

1 Ответ

0 голосов
/ 29 января 2011

Я не знаю другого лучшего (более быстрого) способа получения простого значения из базы данных.

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

Вы также можете кэшировать свое простое значение (прочитайте его один раз во время инициализации и сохраните в соответствующем поле членатвой класс).Но это будет означать, что вы потеряете контроль над его жизненным циклом.Вы не можете вызвать «повторный запрос» непосредственно к значению типа Long или Integer (такого понятия, как Long.requery()) не существует.

Так что да, наличие целого объекта Cursor для одного значения можеткажутся излишними для некоторых вариантов использования, но потом;это не самый распространенный вариант использования для извлечения одного значения (один столбец, одна строка) из базы данных.Для таких значений вы могли бы использовать инфраструктуру SharedPreferences.Скорее всего, вы получите несколько столбцов и несколько строк из базы данных, и с этой точки зрения, я думаю, вы найдете объект Cursor очень удобным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...