В документации Android SDK говорится, что этот startManagingCursor()
метод устарел:
Этот метод устарел. Вместо этого используйте новый класс CursorLoader с LoaderManager; это также доступно на более старых платформах через пакет совместимости с Android. Этот метод позволяет действию заботиться об управлении жизненным циклом данного курсора за вас на основе жизненного цикла действия. То есть, когда действие остановлено, оно автоматически вызывает deactivate () для данного курсора, а при последующем перезапуске вызывает для вас Requery (). Когда действие будет уничтожено, все управляемые курсоры будут закрыты автоматически. Если вы нацеливаетесь на HONEYCOMB или более позднюю версию, вместо этого рассмотрите возможность использования LoaderManager, доступного через getLoaderManager ()
Так что я хотел бы использовать CursorLoader
. Но как я могу использовать его с настраиваемым CursorAdapter
и без него ContentProvider
, когда мне нужен URI в конструкторе CursorLoader
?
Ответы:
Я написал простой CursorLoader , которому не нужен контент-провайдер:
Ему нужен только
AsyncTaskLoader
класс. Либо тот, что в Android 3.0 или выше, либо тот, который поставляется с пакетом совместимости.Я также написал,
ListLoader
который совместим сLoadManager
и используется для получения общейjava.util.List
коллекции.источник
Напишите свой собственный загрузчик, который использует класс вашей базы данных вместо поставщика содержимого. Самый простой способ - просто взять источник
CursorLoader
класса из библиотеки совместимости и заменить запросы поставщика запросами к вашему собственному вспомогательному классу db.источник
CursorLoader
loadInBackground
SimpleCursorLoader - простое решение, однако оно не поддерживает обновление загрузчика при изменении данных. CommonsWare имеет библиотеку loaderex, которая добавляет SQLiteCursorLoader и поддерживает повторный запрос при изменении данных.
https://github.com/commonsguy/cwac-loaderex
источник
Третий вариант - просто переопределить
loadInBackground
:Это также позаботится о повторном запросе курсора при изменении базы данных.
Единственное предостережение: вам нужно будет определить другого наблюдателя, поскольку Google в своей бесконечной мудрости решил сделать свой пакет закрытым. Если вы поместите класс в тот же пакет, что и исходный (или совместимый), вы действительно можете использовать исходный наблюдатель. Наблюдатель - очень легкий объект и больше нигде не используется, так что особой разницы это не имеет.
источник
loadInBackground()
, прежде чем вернуть курсор, скажем,cursor.setNotificationUri(getContext().getContentResolver(), uri);
что uri может быть просто из случайной строки, напримерUri.parse("content://query_slot1")
. Похоже, ему все равно, действительно ли ури существует или нет. И однажды я проделал работу с БД. Скажи, этоgetContentResolver().notifyChange(uri, null);
поможет. Затем я могу создать несколько «слотов URI запроса» в файле contant для приложения с небольшим количеством запросов. Я тестирую вставку записи БД во время выполнения, и кажется, что это работает, но я все еще сомневаюсь, что это хорошая практика. Любое предложение?Третий вариант, предложенный Тимо Ором, вместе с комментариями Йенга дает самый простой ответ (бритва Оккама). Ниже приведен пример полного класса, который подходит мне. Есть два правила использования этого класса.
Каждый раз, когда базовая база данных изменяется (например, после вставки или удаления), обязательно вызывайте
где myUri - это то же самое, что было возвращено вашей реализацией метода getContentUri ().
Вот код класса, который я использовал:
источник