2012-10-05 19 views
12

私は<path_to_SDK>/samples/android-16/NotePad/src/com/example/android/notepadにAndroidのメモ帳アプリケーションのサンプルコードで探しています。コンテンツプロバイダのAndroid投影マップの目的は何ですか?

次のコードは、NotepadProvider.javaで必要とされる理由は、誰もが私に説明することができれば、私は不思議でしたか?

// Creates a new projection map instance. The map returns a column name 
// given a string. The two are usually equal. 
sNotesProjectionMap = new HashMap<String, String>(); 

// Maps the string "_ID" to the column name "_ID" 
sNotesProjectionMap.put(NotePad.Notes._ID, NotePad.Notes._ID); 

// Maps "title" to "title" 
sNotesProjectionMap.put(NotePad.Notes.COLUMN_NAME_TITLE,NotePad.Notes.COLUMN_NAME_TITLE); 

// Maps "note" to "note" 
sNotesProjectionMap.put(NotePad.Notes.COLUMN_NAME_NOTE, NotePad.Notes.COLUMN_NAME_NOTE); 

// Maps "created" to "created" 
sNotesProjectionMap.put(NotePad.Notes.COLUMN_NAME_CREATE_DATE, NotePad.Notes.COLUMN_NAME_CREATE_DATE); 

// Maps "modified" to "modified" 
sNotesProjectionMap.put(
     NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, 
     NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE) 

Iが投影マップがquery()方法に後で使用される気づく:

... 
SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
qb.setTables(NotePad.Notes.TABLE_NAME); 

/** 
* Choose the projection and adjust the "where" clause based on URI pattern-matching. 
*/ 
switch (sUriMatcher.match(uri)) { 
    // If the incoming URI is for notes, chooses the Notes projection 
    case NOTES: 
    qb.setProjectionMap(sNotesProjectionMap); 
    break; 
... 

がなぜこの投影マップが必要ですか?

+1

のドキュメントは 'SQLiteQueryBuilder.setProjectionMapは()'良い説明があります。 – Luksprog

+0

ありがとうございます。多分私の質問は十分ではなかった - 私は投影図が何であるか理解していますが、同じキーと値を持つ写像しか含まれていない投影図があるのはどういうことでしょうか(私は少なくとも1つの写像キーと値のペアが違う)。 – Mewzer

+1

これはサンプルアプリケーションであり、 'API'の使用例とそれらのAPIを使用した優れたプラクティスです。つまり、おそらくプロジェクションマップを使用しています。例えば、私が正しく覚えていれば、Googleのエンジニアの1人が作成した 'Shelves'アプリケーションは' ContentProvider'で投影マップを使用しています。投影マップは同じキーと値のペアを持つ単純なマッピングではありません。 – Luksprog

答えて

10

SDKデモのアプリケーションは、サンプルアプリケーションです。これらは、APIを使用した例とそれらのAPIを使用した優れたプラクティスである必要があります。そのため、おそらく投影マップを使用しています。 Notepadサンプルが実際に投影マップを必要としませんが1つの使用は、いずれかが必要とされ、より複雑なケースのために良いショーケースです。私は右覚えていれば、例えば、Shelvesアプリケーションは、そのContentProviderに投影マップを使用しているGoogleのエンジニアのいずれかによって書かれ、その投影マップは、同一のキーと値のペアを持つだけの単純なマッピングではありません。

私はまた、あなたが投影マップを必要とする理由についていくつかの詳細を持っている方法SQLiteQueryBuilder.setProjectionMapのドキュメントへのリンクを追加しました。

+0

投影マップを使用する理由について説明しますか?私は、クエリと列名の間に別の名前を使用する点を理解していませんか? – Paul

+3

@Paul非常に単純なクエリよりも高度なシナリオで 'SQLiteQueryBuilder'を使用した場合、その投影マップが必要です。たとえば、sqliteテーブルの現在のカラム名と、アプリで必要な任意の名前との間にエイリアスを設定することができます( 'AS' sqliteキーワードhttp://www.sqlite.org/syntaxdiagrams.html#結果列)。また、結合クエリでは、テーブルに同じ名前のカラムがある場合(最も一般的には、それぞれが '_id'カラムを持つ2つのテーブル)に異なる名前が必要になることがあります。 – Luksprog

+0

ありがとうLuksprog – Paul

7

その主な目的は、クエリによって生成カーソルで見つかった列名の名前を変更することです。

@static宣言

SEARCH_PROJECTION_MAP = new HashMap<String, String>(); 
SEARCH_PROJECTION_MAP.put(OpenHelper.NAME, OpenHelper.NAME + " as _name"); 
SEARCH_PROJECTION_MAP.put(OpenHelper.ID , OpenHelper.ID + " as _id"); 

@yourのクエリ機能

//if you query using sqliteQueryBuilder then 
    sqLiteQueryBuilder.setProjectionMap(SEARCH_PROJECTION_MAP); 

//example if you just query 
    Cursor cursor = sqLiteQueryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); 

返される列は、今、この例では_nameと_idです。

+1

受け入れられたものよりも良い説明。 – azizbekian

+0

@アジズベキアン、賛辞をいただきありがとうございます。私は働いている間に見つけて、それが私に起こったようにそれを理解していない他の誰かを探しました。 –

0

投影図の目的は、結合を行うときに列名の変更と列名の明確化を行うことです。投影図の重要な目的は、悪意のある引数から選択を検証することです。

SQLiteQueryBuilderを使用してbuildQueryString(boolean, String, String[], String, String, String, String, String)を使用してステートメントを作成する場合、投影マップが指定されている場合、そのマップに含まれていないフィールドは無視されます。

  1. 設定SQLiteQueryBuilder#setStrict(true)
  2. 投影マップを使用します。あなたは次の操作を行うことができます(例えば、コンテンツプロバイダの消費者のための)悪意のある第三者のアプリに対して最大限の保護を得るために

  3. クエリのいずれかを使用 SQL文字列
0

として文を得るのではなく、オーバーロードたぶん誰かがより完全な説明を必要とします。私は投影マップについての重要な事実を集めました:

  1. 投影マップを必要としない場合は、設定しないでください。このようにして、投影名は投影配列を介して渡されたのとまったく同じように "そのまま"処理されます。

  2. 投影配列もオプションです。クエリにnullを渡すと、SELECT *演算が生成されます。 (実際には、列の追加/削除や並べ替えの際に発生する可能性のある破損のため、SQLでは推奨されません)。

  3. 提供される投影マップは、選択リストにのみ適用されます。したがって、 "store_name" => "bookstore.storename"をマッピングすると "select bookstore.storename ..."になりますが、 "order by"クエリビルダパラメータに "store_name"を指定した場合、または他の修飾されたパラメータを使用すると、潜在的に悪いSQLで終わる可能性があります。

  4. 投影マップを無効にすることができます。投影項目のキー部分に "as"句が含まれる場合、値部分は無視され、結果のSQLにキー部分が挿入されます。たとえば、 "parrot as polly" => "cracker"は "polly ...とParallelly Select Parrot"を生成し、 "cracker"は生成しません。 "as"はすべて大文字でも大文字でも大文字でも大文字でも大文字でも大文字でもかまいません(大文字と小文字は区別されません)。

この記事の詳細情報を読む: http://www.mousetech.com/blog/android-projection-maps-explained/

関連する問題