2012-11-26 21 views
10

私は自分のContentProvideをSQLiteで使うためにthis tutorialを読んでいます。 ContentProvider.queryには、私が困惑するものがいくつかあります。それはちょうど1つのテーブル(チュートリアルのtodoテーブル)に非常にハードコードされているようですが、おそらく私はそれを取得していません?今、別のテーブルを照会したい場合、nodoと言うと、ContentProviderをどのように変更するのですか?SQLiteと複数のテーブルを持つContentProvider

何とかqueryBuilder.setTables(String inTables)にテーブル名を追加する必要がありますか?

表ごとにCONTENT_TYPEとCONTENT_ITEM_TYPEはありますか?

クエリメソッドのTODOおよびTODO_ID変数とスイッチについては?

同じContentProviderを使用して複数のテーブルをサポートするには、多くのif/switch条件が必要なようですが、これは間違ったパスにあるのでしょうか?

は私がのContentProviderを変更する方法を、あなたに
セーレン今

+0

1. setTablesをマッピングするためにUriMatcherの同じインスタンスをusetのContentProvider拡張するクラスのようでなければなりません2 ... 2. Content mime ... Yes 3.再びすべてのテーブルに対して。 4.間違ったパス...いいえ、私は良い道だと思う...あなたは何かの種類のジェネレータfxを検索/書き込もうとすることができますhttp://selvin.pl/autocontent.zip <=その鉱山ですが、まだサポートされていないビューですテーブル – Selvin

答えて

27

私は別のテーブルを照会したい場合、nodo言うことができますありがとうございましたか!新しいテーブルを照会

あなたはUriは、別のテーブルを使用するのと同様のデータソースを選択するので、新しいUriを追加する必要があることを意味します。

あなたは他のテーブルのtodosに既に存在するハードコードされた値を基本的にすべて追加します。たとえば:

// ------- usually the same for all 
private static final String AUTHORITY = "de.vogella.android.todos.contentprovider"; 

// ------- define some Uris 
private static final String PATH_TODOS = "todos"; 
private static final String PATH_REMINDERS = "reminders"; 

public static final Uri CONTENT_URI_TODOS = Uri.parse("content://" + AUTHORITY 
    + "/" + PATH_TODOS); 
public static final Uri CONTENT_URI_REMINDERS = Uri.parse("content://" + AUTHORITY 
     + "/" + PATH_REMINDERS); 

// ------- maybe also define CONTENT_TYPE for each 

// ------- setup UriMatcher 
private static final int TODOS = 10; 
private static final int TODO_ID = 20; 
private static final int REMINDERS = 30; 
private static final int REMINDERS_ID = 40; 
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
static { 
    sURIMatcher.addURI(AUTHORITY, PATH_TODOS, TODOS); 
    sURIMatcher.addURI(AUTHORITY, PATH_TODOS + "/#", TODO_ID); 
    sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS, REMINDERS); 
    sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS + "/#", REMINDERS_ID); 
} 

//@Override 
public Cursor query(Uri uri, String[] projection, String selection, 
     String[] selectionArgs, String sortOrder) { 

    // Using SQLiteQueryBuilder instead of query() method 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 

    int uriType = sURIMatcher.match(uri); 
    switch (uriType) { 

     case TODO_ID: 
      // Adding the ID to the original query 
      queryBuilder.appendWhere(TodoTable.COLUMN_ID + "=" 
        + uri.getLastPathSegment()); 
      //$FALL-THROUGH$ 
     case TODOS: 
      queryBuilder.setTables(TodoTable.TABLE_TODO); 
      break; 

     case REMINDERS_ID: 
      // Adding the ID to the original query 
      queryBuilder.appendWhere(ReminderTable.COLUMN_ID + "=" 
        + uri.getLastPathSegment()); 
      //$FALL-THROUGH$ 
     case REMINDERS: 
      queryBuilder.setTables(ReminderTable.TABLE_REMINDER); 
      break; 

     default: 
      throw new IllegalArgumentException("Unknown URI: " + uri); 
    } 

は私がqueryBuilder.setTables(文字列inTables)に何らかの形でテーブル名を追加する必要がありますか?

異なる場合はUri異なるテーブルから読み込み、Uriマッチに基づいてテーブルを設定します。

各テーブルに1つのCONTENT_TYPEとCONTENT_ITEM_TYPEはありますか?

実際のコンテンツタイプによって異なります。それらが異なっていて、タイプがyesである必要がある場合。しかし、あなたはそれらをまったく持っている必要はありません。その例はそれらを定義しますが、それらを使用しません。タイプをgetTypeに戻す必要があります。documentationを参照してください。

クエリメソッドのTODOおよびTODO_ID変数とスイッチについては?

ものがうまくhere説明するUriMatcherに対して定義された定数です。基本的には、文字列のマッチングのための単純化です。大きなContentProviderは100種類の異なるUrisを持つことができ、if (uri.getPath().equals("todos") { /* code */ } else if (uri..を書かなければならない場合は、queryで正しいテーブルを選択することは苦しいでしょう。

+0

こんにちは、この場合、deleteメソッドをどのように実装しますか?助けてもらえますか? – JoaoFilipeClementeMartins

1

ここではsolutionですが、UriMatcherを使用すると、コンテンツプロバイダに複数のテーブルを実装できます。

0

コンテンツタイプと、次のようにコンテンツアイテムをすることができ、それらはテーブルごとに別々のクラスにラップすることができる

public static final String GENERAL_CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myfirstapp.db.member" ; public static final String SPECIFIC_CONTENT_TYPE = "vnd.android.cursor.item/vnd.myfirstapp.db.member" ;

`vnd.android.cursor.dir/vnd.yourownanything.anything.tablename 「

これは一般的なコンテンツタイプ 'vnd.android.cursor.item/vnd.anthingasabove.table定義」 を任意のアプリケーションに、これは、特定のを定義し、それが一定であるこれらの文字列(単語)vnd.android.cursor .dirと.itemは、それと同じで、/ vndの後になければなりません。あなたは、あなたがしなければならないが、まだ指して参加する必要がある場合は、それはあなたのニーズに依存して...その

とあなただけのテーブルに