Зачем использовать хэш-карту (sNotesProjectionMap в примере NotePad) перед запросом? - PullRequest
2 голосов
/ 15 января 2012

зачем нам устанавливать projectionMap с помощью SQLiteQueryBuilder? Например, мы установили этот HashMap:

sNotesProjectionMap = new HashMap<String, String>();
sNotesProjectionMap.put(Notes._ID, Notes._ID);
sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
sNotesProjectionMap.put(Notes.CREATED_DATE, Notes.CREATED_DATE);
sNotesProjectionMap.put(Notes.MODIFIED_DATE, Notes.MODIFIED_DATE);

и в «запросе» мы также указываем проекцию, выбор и т. Д. Из Activity, так какой смысл делать эту хэш-карту первой?

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
        String sortOrder) {
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    qb.setTables(NOTES_TABLE_NAME);

    switch (sUriMatcher.match(uri)) {
    case NOTES:
        qb.setProjectionMap(sNotesProjectionMap);
        break;

    case NOTE_ID:
        qb.setProjectionMap(sNotesProjectionMap);
        qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));
        break;

    //...
    SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
}

Спасибо

1 Ответ

4 голосов
/ 15 января 2012

Вы можете проверить документацию для setprojectionmap .Он выполняет переводы из имен столбцов приложения в столбцы базы данных.Hashmap будет иметь перевод.

Ключ на карте - это имя столбца, которое будет использовать приложение, а значение - имя столбца в базе данных.

Они идентичны в NotePadProvider в вашем примере, но они могут отличаться, если имя столбца в базе данных изменилось, и вы хотите сохранить изменение прозрачным для приложений, использующих контент-провайдера.

Например, если имя столбца базы данных поля «title» (которое хранится в Notes.TITLE) изменилось на «content», можно создать новую константу Notes.CONTENT, и при вставке проекциикак:

sNotesProjectionMap = new HashMap<String, String>();
...
sNotesProjectionMap.put(Notes.TITLE, Notes.CONTENT);
...
...