2015-08-08 4 views
-1

Почему в платформе Android нет SqliteCursorLoader? Это будет похоже на CursorLoader, но вместо SQLite DB вместо Content Provider. Я нашел некоторые реализации в Интернете, и это кажется полезным.AOSP contrib: CursorLoader для Sqlite DB вместо ContentProvider

+0

@CommonsWare, одна из реализаций, которые я нашел, была ваша. Что-то добавить? Благодарю. –

ответ

2

Почему в платформе Android нет SqliteCursorLoader?

Поскольку было бы очень сложно выполнить договор Loader. Есть три вещи, которые Loader должен быть в состоянии сделать:

  1. сделать работу асинхронно. Это можно было бы обработать путем наследования от AsyncTaskLoader, поэтому здесь нет реальной проблемы.

  2. Сохраните загруженные данные при изменении конфигурации. Это обеспечивается каркасом, поэтому здесь нет реальной проблемы.

  3. Автоматически доставлять обновленный контент при изменении содержимого.

Пункт №3, где проблема. Единственная причина, почему это работает с CursorLoader, состоит в том, что система ContentProvider уже имеет понятие ContentObserver и уже ожидает, что провайдеры сделают соответствующие уведомления, чтобы система узнала об изменениях данных.

Таким образом, это не просто того, чтобы реализовать SQLiteCursorLoader, но и того, чтобы убедиться, что везде, где вы изменить базу данных, вы поднимаете событие (например, с помощью LocalBroadcastManager), что Loader мог слушать, чтобы знать его необходимо запрашивать базу данных и доставлять свежие Cursor.

Теперь, для внутренних целей проекта, вы можете отказаться от договора и пропустить пункт №3. Это здорово. Однако я бы не рекомендовал распространять такую ​​реализацию (например, как проект с открытым исходным кодом) из-за этого ограничения. И вот почему я прекратил мой SQLiteCursorLoader (за пределами общего мнения, что рамка Loader является неудачной абстракцией).