内容提供商中Android投影地图的目的是什么?

Mew*_*zer 12 android android-contentprovider android-sqlite

我正在查看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)
Run Code Online (Sandbox Code Playgroud)

我注意到投影贴图稍后在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;
...
Run Code Online (Sandbox Code Playgroud)

为什么需要这个投影图?

Luk*_*rog 10

Notepad从应用SDK演示是一个示例应用程序,一个应该是API的使用和使用这些API的良好做法的例子,这就是为什么他们可能使用的投影图.虽然Notepad样本并不真正需要投影图,但是当需要一个投影图时,使用一个投影图可以很好地展示更复杂的情况.例如,如果我没记错的话,Shelves其中一位Google工程师编写的应用程序在其中使用了投影贴图,ContentProvider而投影贴图不仅仅是具有相同键值对的简单映射.

我还添加了一个方法文档的链接,SQLiteQueryBuilder.setProjectionMap其中包含了为什么需要投影贴图的一些细节.

  • @Paul当你使用`SQLiteQueryBuilder`来获得比非常简单的查询更高级的场景时,需要投影贴图.例如,您可能希望在sqlite表的当前列名和应用程序中所需的任意名称之间建立别名(请查看`AS` sqlite关键字http://www.sqlite.org/syntaxdiagrams.html#结果列).同样在连接查询中,如果表中的列具有相同的名称(最常见的是两个表都有一个`_id`列),则可能需要使用不同的名称. (3认同)

Jua*_*dez 8

其主要目的是重命名查询生成的游标中的列名.

@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" );  
Run Code Online (Sandbox Code Playgroud)

@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 );
Run Code Online (Sandbox Code Playgroud)

在此示例中,返回的列现在是_name和_id.