为什么我们需要使用 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/