Loaders and ContentProviders

Содержание

Слайд 2

ContentProvider -- компонент приложения, позволяющий получать доступ к данным в табличном

ContentProvider -- компонент приложения, позволяющий получать доступ к данным в табличном

виде и в виде файлов
Доступ к ContentProvider-у не ограничен рамками приложения, в котором он реализован
Доступ к данным осуществляется через Uri

Что такое ContentProvider?

Слайд 3

Loader-ы -- набор классов и интерфейсов, облегчающих организацию асинхронной загрузки данных

Loader-ы -- набор классов и интерфейсов, облегчающих организацию асинхронной загрузки данных

и сохранение данных при изменении конфигурации
Доступ к возможностям Loader-ов можно получить из любой Activity или Fragment-а
CursorLoader отслеживает изменения источника данных

Что такое Loader?

Слайд 4

CursorLoader перезапрашивает данные при правильном использовании notifiChange и setNotificationUri Метод setNotificationUri

CursorLoader перезапрашивает данные при правильном использовании notifiChange и setNotificationUri
Метод setNotificationUri класса

Cursor позволяет установить URI данных, изменение которых нужно отслеживать
В методах insert, update, delete вызываем метод notifyChange класса ContentResolver с URI элемента или элементов, подвергшихся изменению
При обновлении потомка, обновляются родители
content://ru.ilapin.recyclerviewandcontentprovider.provider/cities/65 обновит content://ru.ilapin.recyclerviewandcontentprovider.provider/cities
Работа осуществляется через ContentResolver

Совместная работа ContentProvider-а и Loader-а

Слайд 5

Используя информацию из класса-контракта узнать URI данных ContactsContract.Contacts.CONTENT_URI Реализовать интерфейс LoaderManager.LoaderCallbacks

Используя информацию из класса-контракта узнать URI данных ContactsContract.Contacts.CONTENT_URI
Реализовать интерфейс LoaderManager.LoaderCallbacks
В методе onCreateLoader

инстанциировать Loader

Системные ContentProvider-ы на примере ContactProvider-а 1

Слайд 6

В методе onLoadFinished написать код обрабатывающий получение данных из Loader-а В

В методе onLoadFinished написать код обрабатывающий получение данных из Loader-а
В методе

onLoaderReset написать код обрабатывающий сброс Loader-а

Системные ContentProvider-ы на примере ContactProvider-а 2

Слайд 7

Вызвать getLoaderManager().initLoader(LOADER_ID, null, this) и передать в него идентификатор Loader-а (int-овое

Вызвать getLoaderManager().initLoader(LOADER_ID, null, this) и передать в него идентификатор Loader-а (int-овое

число), Bundle с аргументами (может быть null), и реализацию интерфейса

Системные ContentProvider-ы на примере ContactProvider-а 3

Слайд 8

На примере списка городов Создать класс-наследник ContentProvider-а Реализовать onCreate для легковесной

На примере списка городов
Создать класс-наследник ContentProvider-а
Реализовать onCreate для легковесной инициализации (БД,

UriMatcher)

Реализация ContentProvider-а 1

Слайд 9

Контракт Реализация ContentProvider-а 2

Контракт

Реализация ContentProvider-а 2

Слайд 10

Реализовать query для получения данных Реализация ContentProvider-а 3

Реализовать query для получения данных

Реализация ContentProvider-а 3

Слайд 11

Реализовать insert для вставки данных, принимает Uri данных и данные, возвращает

Реализовать insert для вставки данных, принимает Uri данных и данные, возвращает

Uri сохранённых данных, getContext().getContentResolver().notifyChange. В нашем случае пустой.
Реализовать delete для удаления данных, принимает Uri данных, условия выборки для удаления, возвращает количество затронутых записей, notifyChange. В нашем случае пустой.

Реализация ContentProvider-а 4

Слайд 12

Реализовать update для обновления данных, принимает Uri данных, данные, условия выборки

Реализовать update для обновления данных, принимает Uri данных, данные, условия выборки

для обновления, возвращает количество затронутых записей, notifyChange

Реализация ContentProvider-а 5

Слайд 13

Реализовать getType Реализация ContentProvider-а 6

Реализовать getType

Реализация ContentProvider-а 6

Слайд 14

Реализовать openAssetFile Реализация ContentProvider-а 7

Реализовать openAssetFile

Реализация ContentProvider-а 7

Слайд 15

В ContentResolver-е можно регистрировать ContentObserver Реализация ContentProvider-а 8

В ContentResolver-е можно регистрировать ContentObserver

Реализация ContentProvider-а 8

Слайд 16

Объявить провайдер в манифесте Реализация ContentProvider-а 9

Объявить провайдер в манифесте

Реализация ContentProvider-а 9

Слайд 17

Доступ к ContentProvider-у можно получать не только из приложения, в котором

Доступ к ContentProvider-у можно получать не только из приложения, в котором

он реализован, но и из других приложений android:exported=“true”
Можно ограничивать доступ, указывая android:readPermission="ru.ilapin.recyclerviewandcontentprovider.READ_CITIES“
Для получения файла нужно реализовать метод openAssetFile или подобный ему (openFile)
В методе getType добавить MIME для файла

Права доступа и получение файлов через ContentProvider-ы

Слайд 18

Создать класс-наследник AsyncTaskLoader-а Реализовать по крайней мере методы loadInBackground и onStartLoading

Создать класс-наследник AsyncTaskLoader-а
Реализовать по крайней мере методы loadInBackground и onStartLoading

Реализация Loader-а

на примере AsyncTaskLoader-а 1
Слайд 19

В loadInBackground размещается основная «тяжёлая» логика загрузки, метод будет выполняться не

В loadInBackground размещается основная «тяжёлая» логика загрузки, метод будет выполняться не

в главном потоке

Реализация Loader-а на примере AsyncTaskLoader-а 2

Слайд 20

onStartLoading должен содержать минимальную логику по запуску загрузки (вызов forceLoad) Реализация Loader-а на примере AsyncTaskLoader-а 3

onStartLoading должен содержать минимальную логику по запуску загрузки (вызов forceLoad)

Реализация Loader-а

на примере AsyncTaskLoader-а 3