私は現在、RESTfulWebサービスと対話するAndroidアプリを開発しています。クライアントは、Webサービスで完全なCRUDを実行できます。ベストプラクティスを検索した後、ほとんどすべての記事で引用されているRESTクライアントに関するGoogle I /O2010の基調講演を見ました。
できるだけ多くのAndroidプラットフォームを使用するために、 aとaを使用してオプションBを使用することにしました。これにより、組み込みのアカウントシステム、コンテンツオブザーバー、およびインターネットが利用可能な場合の定期的な同期が提供されました。ContentProvider
SyncAdapter
私たちのアプリの非常に重要な機能の1つはオフライン編集と可用性(受信状態の悪い環境で使用される)であるため、可能な限り多くの関連データをローカルに保持したいと考えています。
クライアントはJsonのRESTfulAPIを使用してサーバーと通信し、サーバーからのデータはGson on Models(POJO、Plain Old Java Object)を使用して逆シリアル化されます。
コードを明確で読みやすくするために、直接使用するのではなく、独自のオブジェクトマッパーを作成してみました。Cursor
このマッパーは、デフォルトのCRUD操作を提供し、データを読み取るときにカーソルをモデルにマップし、データを書き込むときにモデルをContentValuesにマップします。
ただし、このアーキテクチャは非常に肥大化したように感じます。
まず第一に、現在に関する信頼できる情報を取得することはできません
SyncState
(ユーザーにフィードバックを提供するため)。(現在、このSO回答を使用して「ハッキング」されています)2番目の問題は、必要なリソースごとに、モデル、マッパー、テーブル定義、およびContentProviderURIです。これは、たった1つのリソースで管理するための多くのコードです。
CursorLoader
3番目の問題は、マッパーを介してモデルを要求することで、アクティビティでの使用をブロックしたことです。
結論
オフラインコンテンツを作成し、Jsonを使用してRESTfulWebサービスと同期するための保守可能で軽量な方法を探しています。また、 (現在Mapperクラスに隠されている)よりも開発者にとってはるかに使いやすいため、コードでモデルを使用できるようにしたいと思います。user.getName()
cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME));
マッピングの良い例は、.NET用に作成されたDapper拡張機能と組み合わせたDapperですが、私のアプローチと似ていますが、私のアプローチでは、すべての列とフィールドを多くの異なるファイルで定義する必要がありました(上記を参照)。
また、ContentProvider
このような単純なタスクでは非常に肥大化して時代遅れになっていると感じるため、コードから削除することを検討しています。