すでに書かれたアプリケーションの機能を含むライブラリを作成しようとしています。古いアプリは複雑なsqliteデータベースを使用しています。私は、コンテンツプロバイダのバックエンドとして古いデータベースを再利用しようとしています。何をしようとしているのか、さまざまな例をどのように適応させるのかについてのベストプラクティスを理解することはできません(this、this、私は自分の状況に気づいた。複数のテーブルを持つ複雑な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に依存せず、書き込み、およびハンドルは内側の選択/問い合わせを持って選択すると一緒に参加するにはどうすればよい
よろしくお願いします。 ----- 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
基本的に、私は 'ContentProvider'を使って私が何をしているのかを理解することができたと確信しています。私の問題は、***正しい/ベストプラクティス***を理解することから来ています。このライブラリを使用する次の人は、他のAndroid提供の 'ContentProviders'と同様にこのライブラリを使用することができることを示します。 -------また、CursorLoadersとの良好な統合と今後の可能なSyncAdapterの使用のために、 'ContentProvider'を使用したいと思います。 -------これまでのご協力ありがとうございました – jp36
@ jp36:「各テーブルにクラスがありますか?」 - あなたが望むなら、クラスを分離するための 'ContentProvider'デリゲートロジックを持つことができます。あなた次第。しかし、「権限」(私の例では 'com.jp36.sooperapp')に縛られているように、' ContentProvider'は1つしかありません。基本的には、権限の右にあるすべてのものは、Uriの値が特定のレコード(右端の整数セグメント)を指すインスタンスIDを例外として、解釈する必要があります。 – CommonsWare