2012-04-30 29 views
2

すでに書かれたアプリケーションの機能を含むライブラリを作成しようとしています。古いアプリは複雑なsqliteデータベースを使用しています。私は、コンテンツプロバイダのバックエンドとして古いデータベースを再利用しようとしています。何をしようとしているのか、さまざまな例をどのように適応させるのかについてのベストプラクティスを理解することはできません(thisthis、私は自分の状況に気づいた。複数のテーブルを持つ複雑なSQLデータベース用のカスタムContentProvider

Supoose私は、カーソルを返され、その後、関数内のすべてのSQLクエリのものを扱っ、私は、このようなparent_uuidなどのパラメータを取った関数呼び出しを提供DbAdapterクラスを使用し、前に、あなたは、このデータベース構造

+------+-------------+-------------+-------------+ 
| Root | Folder | Item  | Subitem | 
+------+-------------+-------------+-------------+ 
| _id | _id   | _id   | _id   | 
| uuid | parent_uuid | parent_uuid | parent_uuid | 
|  | uuid  | uuid  | uuid  | 
|  | name  | name  | name  | 
|  | data  | data  | data  | 
+------+-------------+-------------+-------------+ 
Root->Folder->Item->Subitem 

を持っています結果と

例関数スタブ:

  • get_items_by_parent_uuid(folder_uuid)
  • サブアイテムのために同じ
  • get_item_by_uuid(UUID)

複雑なクエリ項目UUID、項目名、項目データ、フォルダ名と

  • get_items_for_root(root_uuid)
    • 戻るカーソル
  • get_items_with_subitem_count(folder_uuid) アイテムのUUID、項目名、項目データ、subitem.parent_uuidは==私は上記の機能を提供するための最良の方法を把握することはできません

をitem.uuidサブ項目のカウントと

  • 戻りカーソル1 ContentProvider。 私はたくさんのコードを書いてくれる人はいませんが(私もそうでも構いませんが)、私は上記のリンクされた例を修正する方法を知ってもらいたいほとんどの場合、私の現在のニーズに翻訳するだけでは十分ではない例を理解しています。

    TL; DR; - 私は複数のテーブルを処理する単一のContentProviderは、一意の識別子として_idに依存せず、書き込み、およびハンドルは内側の選択/問い合わせを持って選択すると一緒に参加するにはどうすればよい

答えて

3

(例えばselect count(*)など)複数のテーブルを扱う単一のContentProviderを作成するにはどうすればいいですか?

ステップ1:データ構造として単純なJSONオブジェクトに限定してスキーマ用のRESTインターフェイスを設計します。、ネストされたアレイまたはオブジェクト、単純な値のキー)のちょうど地図

ステップ#2:だからCursorsContentValues

とJSONをcontent://com.jp36.sooperapphttp://sooperapp.jp36.com/を交換し、交換、ContentProviderにそのデザインを変換し、たとえば、content://com.jp36.sooperapp/folderおよびcontent://com.jp36.sooperapp/itemおよびcontent://com.jp36.sooperapp/subitemを、これらのタイプの1つ以上に関する情報の取得/変更の基礎としてサポートすることができます。あなたがCursorAdapterを使用して、そしてあなたは、uuidによってあなたは本当に(通常は文字列です)UUIDを意味していますと仮定する予定の場合は

は、一意の識別子

として_idに依存しません選択肢はありませんが、_idも持っている必要があります。ただし、CursorAdapterを使用する予定がない場合は、特に_idは必要ありません。

とハンドル/ ContentProviderデザインあなたのRESTインターフェイスのすべての問題です(SELECT COUNT(*)など)インナー選択/クエリを有することができる選択

と一緒に参加します。 content://com.jp36.sooperapp/folder/countをクエリー対象にしたい場合は、舞台裏でSELECT COUNT(*) FROM Folderで自分自身をノックアウトします。

(注:文字通り自分をノックアウトしていない)

あなたはcontent://com.jp36.sooperapp/omg/omg/omg/this/is/a/long/pathプロバイダーにいくつかinsert()の呼び出しに基づいてItemと17 SubitemsINSERTにしたい場合は、右先に行きます。 ContentProviderは単なるファサードです。それは個人的に

など、 ContentValuesquery()パラメータが何を意味するか、何を意味するのか、何を Uri手段を定義するのはあなた次第

ですが、私はあなたが一歩、あなたはContentProviderで悩まれている理由を自問することをお勧めします。

+0

よろしくお願いします。 ----- 1. 'ContentProvider'を作成するとき、それぞれのクラスの' CONTENT_URI'を 'content://com.jp36.sooperapp/ {tablename}/*'と定義して、 'content://com.jp36.sooperapp/ {tablename}/fromparent/*'のようなオブジェクトの中に定義された 'CONTENT_FROM_PARENT_URI'のような個々のテーブルクラスに別々のcontent_uriを持っていますか? ----- 2. 'content://com.jp36.sooperapp/folder/count'を照会した場合、私のprebuilt sql文と共に渡される' String [] projection'パラメータを処理しますか? – jp36

+0

基本的に、私は 'ContentProvider'を使って私が何をしているのかを理解することができたと確信しています。私の問題は、***正しい/ベストプラクティス***を理解することから来ています。このライブラリを使用する次の人は、他のAndroid提供の 'ContentProviders'と同様にこのライブラリを使用することができることを示します。 -------また、CursorLoadersとの良好な統合と今後の可能なSyncAdapterの使用のために、 'ContentProvider'を使用したいと思います。 -------これまでのご協力ありがとうございました – jp36

+0

@ jp36:「各テーブルにクラスがありますか?」 - あなたが望むなら、クラスを分離するための 'ContentProvider'デリゲートロジックを持つことができます。あなた次第。しかし、「権限」(私の例では 'com.jp36.sooperapp')に縛られているように、' ContentProvider'は1つしかありません。基本的には、権限の右にあるすべてのものは、Uriの値が特定のレコード(右端の整数セグメント)を指すインスタンスIDを例外として、解釈する必要があります。 – CommonsWare

関連する問題