联系人详情界面可以显示联系人数据库中联系人,来自陌生号码的联系人,以及通过网络URL传递过来的包装json数据的联系人等。这里我们只讨论存在于联系人数据库中联系人的数据处理流程。
首先将一个联系人的基本信息取出来;
mContactLoader = (ContactLoader) getLoaderManager().initLoader(
LOADER_CONTACT_ID, null, mLoaderContactCallbacks);
其中ContactLoader类似CursorLoader,同样继承了AsyncTaskLoader类,返回一个Contact类型的封装对象;
其中loadInBackground方法中的 loadContactEntity方法进入了联系人基本信息的查询。
private Contact loadContactEntity(ContentResolver resolver, Uri contactUri) {
Uri entityUri = Uri.withAppendedPath(contactUri, Contacts.Entity.CONTENT_DIRECTORY);
Cursor cursor = resolver.query(entityUri, ContactQuery.COLUMNS, null, null,
Contacts.Entity.RAW_CONTACT_ID);
if (cursor == null) {
Log.e(TAG, "No cursor returned in loadContactEntity");
return Contact.forNotFound(mRequestedUri);
}
try {
if (!cursor.moveToFirst()) {
cursor.close();
return Contact.forNotFound(mRequestedUri);
}
// Create the loaded contact starting with the header data.
Contact contact = loadContactHeaderData(cursor, contactUri);//实质就是只显示唯一项的数据,比如姓名,公司,头像等
// Fill in the raw contacts, which is wrapped in an Entity and any
// status data. Initially, result has empty entities and statuses.
long currentRawContactId = -1;
RawContact rawContact = null;
ImmutableList.Builder<RawContact> rawContactsBuilder =
new ImmutableList.Builder<RawContact>();
ImmutableMap.Builder<Long, DataStatus> statusesBuilder =
new ImmutableMap.Builder<Long, DataStatus>();
do {
long rawContactId = cursor.getLong(ContactQuery.RAW_CONTACT_ID);
if (rawContactId != currentRawContactId) {
// First time to see this raw contact id, so create a new entity, and
// add it to the result's entities.
currentRawContactId = rawContactId;
rawContact = new RawContact(loadRawContactValues(cursor));
rawContactsBuilder.add(rawContact);
}
if (!cursor.isNull(ContactQuery.DATA_ID)) {
ContentValues data = loadDataValues(cursor);
rawContact.addDataItemValues(data);
if (!cursor.isNull(ContactQu