android - 为什么在查询之前使用 hashmap(NotePad 示例中的 sNotesProjectionMap)?

标签 android hashmap android-contentprovider

为什么我们需要使用 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 的投影、选择等,那么首先执行此 HashMap 有何意义?

@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;
}

谢谢

最佳答案

您可以查看 setprojectionmap 的文档。它执行从应用程序列名称到数据库列的转换。 Hashmap 会有翻译。

映射中的键是应用程序将使用的列名称,值是数据库中的列名称。

它们在您的示例中的 NotePadProvider 中是相同的,但如果数据库中的列名称发生更改并且您希望使更改对使用内容提供程序的应用程序保持透明,则它们可能会有所不同。

例如,如果“title”字段(存储在 Notes.TITLE 中)的数据库列名称更改为“content”,则可以创建一个新的常量 Notes.CONTENT,并且投影插入将如下所示:

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

关于android - 为什么在查询之前使用 hashmap(NotePad 示例中的 sNotesProjectionMap)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869963/

相关文章:

android - Android ColorMatrix setSaturation() 是否支持大于 1 的值?

android - Firebase isEmailVerify在Kotlin中不起作用

android - 将 YouTube 视频播放器嵌入到 Android 移动应用程序中?

Java:多个键,一个值HashMap,指向完全相同的值

java - 如何在java中排序和打印hashMap

Android ContentObserver 从未停止

java - Android Studio - 非法字符 8204 错误

Java: "prime"数字或 "power of two"作为 HashMap 大小?

javascript - 从 PhoneGap JavaScript 访问 Android 上的 Content Provider

本地 SQLite 数据库的 Android 内容提供程序 : why?