10

私は現在、RESTfulWebサービスと対話するAndroidアプリを開発しています。クライアントは、Webサービスで完全なCRUDを実行できます。ベストプラクティスを検索した後、ほとんどすべての記事で引用されているRESTクライアントに関するGoogle I /O2010の基調講演を見ました。

できるだけ多くのAndroidプラットフォームを使用するために、 aとaを使用してオプションBを使用することにしました。これにより、組み込みのアカウントシステム、コンテンツオブザーバー、およびインターネットが利用可能な場合の定期的な同期が提供されました。ContentProviderSyncAdapter

私たちのアプリの非常に重要な機能の1つはオフライン編集と可用性(受信状態の悪い環境で使用される)であるため、可能な限り多くの関連データをローカルに保持したいと考えています。

クライアントはJsonのRESTfulAPIを使用してサーバーと通信し、サーバーからデータGson on Models(POJO、Plain Old Java Object)を使用して逆シリアル化されます。

コードを明確で読みやすくするために、直接使用するのではなく、独自のオブジェクトマッパーを作成してみました。Cursorこのマッパーは、デフォルトのCRUD操作を提供し、データを読み取るときにカーソルモデルにマップし、データを書き込むときにモデルContentValuesにマップします。

ただし、このアーキテクチャは非常に肥大化したように感じます。

  • まず第一に、現在に関する信頼できる情報を取得することはできませんSyncState(ユーザーにフィードバックを提供するため)。(現在、このSO回答を使用して「ハッキング」されています)

  • 2番目の問題は、必要なリソースごとに、モデル、マッパー、テーブル定義、およびContentProviderURIです。これは、たった1つのリソースで管理するための多くのコードです。

  • CursorLoader3番目の問題は、マッパーを介してモデルを要求することで、アクティビティでの使用をブロックしたことです。

結論

オフラインコンテンツを作成し、Jsonを使用してRESTfulWebサービスと同期するための保守可能で軽量な方法を探しています。また、 (現在Mapperクラスに隠されている)よりも開発者にとってはるかに使いやすいため、コードでモデルを使用できるようにしたいと思います。user.getName()cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME));

マッピングの良い例は、.NET用に作成されたDapper拡張機能と組み合わせたDapperですが、私のアプローチと似ていますが、私のアプローチでは、すべての列とフィールドを多くの異なるファイルで定義する必要がありました(上記を参照)。

また、ContentProviderこのような単純なタスクでは非常に肥大化して時代遅れになっていると感じるため、コードから削除することを検討しています。

4

1 に答える 1

1

ORMの使用を検討しましたか?私は過去にOrmLiteJacksonの組み合わせで成功しました。同期のために独自のサービスを作成する必要がありますが、データモデルに関しては、OrmLiteが面倒な作業を処理します。

ContentProviderとSyncAdapterの組み合わせが提供する優れた機能の一部は得られませんが(POJOを使用している場合はCursorLoaderはありません)、このセットアップにより、複雑なスキーマや多くの型の負担が軽減される可能性があります。

OrmLiteのホームページからのテーブル定義の例を次に示します。

@DatabaseTable(tableName = "accounts")
public class Account {
    @DatabaseField(id = true)
    private String name;

    @DatabaseField(canBeNull = false)
    private String password;   
}

ご覧のとおり、モデル+マッピング+テーブル定義は非常に迅速かつ簡単にまとめられます。

于 2013-03-22T17:49:52.453 に答える