-
Notifications
You must be signed in to change notification settings - Fork 351
2.15. ContentProvider の発展
この章では、ContentProvider の発展的な使用について解説します。
参考:Content Provider Basics | Android Developers
参考:Transferring Data Using Sync Adapter | Android Developers
- [ContentProvider へのアクセス](#ContentProvider へのアクセス)
- バッチ処理
- Intent によるアクセス
-
データの同期
- AbstractThreadedSyncAdapter
- Service
- メタデータの宣言
- AndroidManifest の宣言
- 同期の実行と下位互換
ContentProvider へのアクセスは、ContentResolver を介して行うことは、2.10. データベースにて解説しました。このページの方法では、1 回のアクセスで 1 回の操作(挿入、更新、削除)を行うように動作します。
今回は、1 回のアクセスで複数の操作(挿入、更新、削除)を行う、バッチ処理について解説するとともに、ContentResolver 以外の手段を用いた ContentProvider へのアクセスについて解説します。
しばしば、アプリケーションはサーバサイドとのデータのやり取りを密接にやりとりします。ネットワークにつながらない場所に居ても、最低限、それ以前にサーバからダウンロードしておいたデータへのアクセス性を確保したり、定期的にアプリケーション内に蓄積したデータをサーバへ送信することでバックアップを取ったりするような仕組みは、ネットワークへの接続が必ずしも常にあるとは限らない環境において、また、多様な端末を複数使用する環境においては、とても大切な仕組みとなります。
Android では、これらを支援する仕組みとして、クラウドとの同期のためのフレームワークを提供しています。今回は、特に ContentProvider を用いたフレームワークに注目して解説します。
ContentProvider 以外にも同期の仕組みが存在しますが、この仕組は3.08. クラウド同期で解説します。
ContentProvider のデータの同期を目的としたクラスで、ContentResolver によって同期のタイミングが管理されます。
このクラスは、アプリケーションプロセスが実行中、ワーカスレッド上でクラウドとの同期処理を記述するフレームワークを提供しています。UI スレッドとは別のスレッド上で実行される為、各種の IO を同期的に記述しても問題ありません。
public MySyncAdapter extends AbstractThreadedSyncAdapter { public MySyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); } @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { } }
データの同期のタイミングで呼び出され、AbstractThreadedSyncAdapter に記述した同期の手続きを実行するための Service を定義します。
AbstractThreadedSyncAdapter のインスタンスは、アプリケーションのライフサイクルの中で Singleton として扱うようにし、複数の AbstractThreadedSyncAdapter のインスタンスを生成して並列に同期を実行してしまうことを防ぎます。
public MySyncService extends Service { private static AbstractThreadedSyncAdapter sAdapter; private static final Object LOCK = new Object(); @Override public void onCreate() { synchronized (LOCK) { if (sAdapter == null) { sAdapter = new MySyncAdapter(getApplicationContext(), true); } } } @Override public IBinder onBind(Intent intent) { return sAdapter.getSyncAdapterBinder(); } }