0

私は通常のSQLiteDB内にデータを保存するAndroidアプリケーションを開発しています。これらのデータを自分のアプリケーションのコンポーネント(アクティビティとサービス)および他のアプリケーションに公開する必要があります。

残念ながら、これらのデータをDBに格納する前、およびDBから取り出す前に、さまざまな、おそらく複雑な方法でこれらのデータを操作する必要があります。フィールドを編集したり、複数の行または複数の列からデータを集約したりする必要があります。つまり、多くのビジネスインテリジェンスプログラムと多くの統計プログラムによって実行されることがわかる典型的な「データマッサージ」を実行する必要があります。

これは、SQLiteDBだけでは少なすぎることを意味します。単純なCRUDよりもはるかに多くのことをしなければなりません。

コンテンツプロバイダーも解決策ではないようです。典型的なAndroidCPは、標準のCRUDと非常によく似たインターフェースを実装し、さらに重要なことに、常にカーソル(行と列で編成されたデータの一時テーブル)を返します。私のニーズには、SQLデータベースの非常に薄いラップアラウンドのように見えます。ビジネスロジックをCP自体の内部に配置できるかどうか、外部CPインターフェイス(「コンテンツ:...」)を拡張できるかどうか、そして天候に応じてこれをグッドプラクティスと見なすことができるかどうかを理解する必要があります。

たぶん、Androidサービスは私の機能を公開する方法を私に与え、SQLite DB(またはSQLIte DBを含むCP)をサービスに埋め込むことができます。これが解決策になるかどうか、そしてその方法を私はまだ理解する必要があります。

私が本当に必要としているのは、おそらく、RESTfulWebサービスのようなものでしょう。

  1. 私の「モノ」の中核にあるデータを格納するSQLDB
  2. 動詞(GET、PUT、POSTなど)と単数形/複数形の名前(「People」、「John Doe」など)を受け入れ、「オブジェクト」(必ずしも「Javaオブジェクト」である必要はありません。 JSONまたはXMLファイル/ストリーム)。このインターフェースは、外部から見える唯一のレイヤーになります。
  3. 真ん中、私の「ビジネスロジック」はデータを操作するために使用されていました。

もちろん、標準のCPはRESTful WSと非常によく似ており、私の問題の解決策になる可能性があります。CPがこれに十分な柔軟性があるかどうかはわかりません。たとえば、CPはGET / PUTのような要求のみを受け入れることができ、カーソル以外のものを返すことはできないように見えます。

では、アプリケーションのさまざまな部分(アクティビティ)や他のアプリケーションに、CRUD以外の機能と基本データだけを公開するために何を使用しますか?

ただのAndroidコンテンツプロバイダー(おそらくCP自体の中にビジネスロジックを書いています)?

SQL DBをラップアラウンドする(またはCPをラップアラウンドする)Androidサービス?

ほかに何か?

どのアーキテクチャが最もエレガントでしょうか(「保守可能」、「拡張可能」、「柔軟」、「オープン」)?このための「ベストプラクティス」はありますか?

あなたの考慮事項/提案?

4

2 に答える 2

0

OK、私の場合に使用される「正しい」アーキテクチャは、barn.gumblによって提案されたもののようです。

  1. 最も内側のレベルでは、SQLiteDBを使用してデータを保存します。
  2. SQLiteDBをAndroidコンテンツプロバイダーでラップします。これは実際には必須ではありませんが、コードがはるかにモジュール化されるため、ほとんどの場合は良い考えです。CPには、アプリケーションの任意のアクティビティ/サービスから、およびアクセスが許可されている任意の外部アプリケーションからアクセスできます。
  3. CPをAndroidサービスでラップします。これは、(私の場合のように)単純なCRUDとは異なるまたはより豊富なAPIを公開/公開する唯一の方法です。これは、カーソルオブジェクトとは異なるものを返す唯一の方法でもあります。

この階層化アーキテクチャの使用:

  1. 読み取りまたは書き込み中に、データに対してあらゆる種類の操作を実行できます
  2. CPで許可されているものよりも豊富なAPIを公開できます
  3. あらゆる種類のオブジェクトを返すことができます

Androidアーキテクチャを尊重しながら、これらすべてを実行します(CPとサービスの両方を、他のアプリケーションで使用する権限がある場合は、他のアプリケーションで使用できます)。

私の場合、非常に奇妙な方法でデータを集約し、集約を表す単一のオブジェクトを返す必要があります。これは、CPだけではエレガントな方法では実行できないものです。

于 2012-11-28T13:23:45.840 に答える
0

私はあなたの問題をよく理解しているとは思いませんが、SQLite、CP、Serviceの交換に少し混乱しているようです。通常、それらは並んで動作します。多分それはあなたを助けることができます:Google I / O2010-AndroidRESTクライアントアプリケーション

私の提案/仮定:

->アクティビティ、POJO->サービス(HadlerThread(個別のスレッド+メッセージキュー))-> CP

于 2012-11-27T19:50:32.993 に答える