- すべてのサーバー側と同期DBアクセスをバックグラウンドスレッドで自動的にスケジュールします。ただし、アプリケーションフロントエンドでは、コンテンツリゾルバー/プロバイダーは通常、デフォルトでUIスレッドからクエリ/トランザクションを実行します。
CursorLoader
アプリケーションがUI側でスムーズに実行されるようにするには、すべてのトランザクションを非同期で(つまり、を使用して)実行する必要があります。
- を介してアクセスするすべてのスレッドからの再入可能なDBアクセスをローカライズする
ContentProvider
ため、すべてのロックは、DBレイヤー、サービス、およびUIレイヤーで追跡するのではなく、ContentProviderオーバーライド呼び出しで完全に発生します。
- 上記の一部として、データへの優れたシングルトンインターフェイスも提供します-アプリに10個のActivityクラスがある場合は、SQLiteDatabaseの開閉を処理する必要があるのではなく、それぞれからContentResolver静的呼び出しを実行するだけです。アプリ内のあるアクティビティから別のアクティビティにジャンプするときの各アクティビティ。
- ContentProviderは、SyncAdapterモデルと非常に緊密に連携しています。つまり、データベースをネット上でサーバーがホストするデータベースと同期させたい場合は、これがほぼ唯一の方法です。(アプリはREST apiタイプの状況を反映しています)
- これは、ContentResolverのContentObserverインターフェイスに関連付けられています。これは、(他の多くの便利な機能の中でも)ビューが特定のデータセットを監視するものとして登録できるインターフェイスです(カーソルを介してそのデータにアクセスします)。次に、ContentProviderに変更を加えると、CPはCRに通知でき、CRは関連するカーソルに通知できます。これにより、クエリが再実行され、ビューが更新されます。これは、ビューを手動で追跡して無効にして再描画できるようにするよりもはるかにクリーンです。
DBの再入可能ロックに関しては、完全には実行されませんが、それは役立ちます-ContentProviderクラスは4つの単純な関数(CRUDインターフェイス)を実装し、オーバーライドすることを選択した場合は、5番目のbatchAdd()- -これにより、ロックがローカライズされます。骨の折れる簡単な答えは、関数レベルで「同期された」これらの関数宣言の4つまたは5つすべてにタグを付けるだけで、完了です。5つの異なるアクティビティでDBにアクセスする20の場所からロックアウトすることを理解しようとするよりもはるかにクリーンです。