13

のAndroidメモ帳アプリケーションのサンプルコードを見ています<path_to_SDK>/samples/android-16/NotePad/src/com/example/android/notepad

なぜ次のコードが必要なのか、誰かが私に説明できるかどうか疑問に思いました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)

投影マップが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;
...

なぜこの投影図が必要なのですか?

4

4 に答える 4

10

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

SQLiteQueryBuilder.setProjectionMapまた、投影図が必要になる理由の詳細が記載されたメソッドのドキュメントへのリンクも追加しました。

于 2012-10-09T12:27:36.503 に答える
9

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

@静的宣言

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" );  

@クエリ機能

//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になります。

于 2015-07-03T01:21:15.590 に答える
0

Juanが言ったように、射影マップの目的は、列名の名前を変更することと、結合を行うときに列名を明確にすることです。射影マップの重要な目的は、悪意のある引数に対して選択を検証することです。

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

悪意のあるサードパーティアプリ(コンテンツプロバイダーのコンシューマーなど)から最大限の保護を得るには、次のようにします。

  1. セットするSQLiteQueryBuilder#setStrict(true)
  2. 投影図を使用します。
  3. ステートメントをSQL文字列として取得する代わりに、クエリオーバーロードの1つを使用します
于 2016-03-25T15:18:21.343 に答える
0

たぶん誰かがもっと徹底的な説明を必要としています。投影図に関する重要な事実を集めました。

  1. 投影図が必要ない場合は、設定しないでください。このようにして、プロジェクション名は、プロジェクション配列を介して渡されたとおりに「そのまま」処理されます。

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

  3. 付属の投影図は選択リストにのみ適用されます!したがって、「store_name」=>「bookstore.storename」をマップすると、「select bookstore.storename ...」になりますが、「orderby」クエリビルダーパラメータまたは次のいずれかで「store_name」を指定した場合他の修飾されたパラメーターでは、SQLが不良になる可能性があります。

  4. 投影図は無効にすることができます。プロジェクションエントリのキー部分に「as」句が含まれている場合、値部分は無視され、キー部分が結果のSQLに挿入されます。たとえば、「parrotaspolly」=>「cracker」は「SELECTparrotaspolly ...」を生成し、「cracker」は生成しません。「as」は、すべて大文字またはすべて小文字(大文字と小文字が混在しない)のいずれかであり、「as」という単語の前後に少なくとも1つのスペースが必要です。

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

于 2016-08-19T14:05:01.580 に答える