对多个数据源使用游标加载器
Use cursor loader for multiple data sources
我有代码可以使用联系人姓名作为选择从 Android 中获取联系人信息。但是,数据源(我猜应该是 ContactsContract.Contacts)没有我需要的有关联系人的所有信息。我看到联系信息分为几个表(ContactsContract.CommonDataKinds.StructuredName、ContactsContract.CommonDataKinds.Phone 等)。我还注意到所有这些来源都可以访问 LOOKUP_KEY 字段。它唯一标识一个联系人。我想知道是否有办法使用 LOOKUP_KEY.
对这些数据源执行连接
下面,我目前为单个数据源设置投影和选择,并使用游标加载器异步查询它。有没有办法使用 LOOKUP_KEY?
一次搜索多个数据源
private static final String[] CONTACT_PROJECTION = {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.HAS_PHONE_NUMBER
};
private static final String CONTACT_SELECTION = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
+ " LIKE ?";
public static Loader<Cursor> getContactLoader(Context applicationContext, String searchString) {
String[] selectionArgs = new String[1];
selectionArgs[0] = "%" + searchString + "%";
return new CursorLoader(
applicationContext,
ContactsContract.Contacts.CONTENT_URI,
CONTACT_PROJECTION,
CONTACT_SELECTION,
selectionArgs,
null
);
}
所有联系人的所有信息都分组在别名 table 中,它们实际上存储在一个名为 Data
的大 table 中,因此您可以简单地查询 [=17] =] 获取与特定联系人相关的所有信息(您可以使用 CONTACT_ID
,无需使用更麻烦的 LOOKUP_URI
),如下所示:
public void getContactInfo(long contactId) {
Uri uri = Data.CONTENT_URI;
String[] projection = new String[]{
Data.CONTACT_ID,
Data.DISPLAY_NAME,
Data.MIMETYPE,
Data.DATA1}; // you can get additional info if needed in Data.DATA2, DATA3, etc.
// get all relevant info about the contact
String selection = Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + " IN (?,?,?,?)"; // you can add more question marks if you need more MIMETYPES
String[] selectionArgs = new String[]{String.valueOf(contactId), Phone.CONTENT_ITEM_TYPE, Email.CONTENT_ITEM_TYPE, Event.CONTENT_ITEM_TYPE, StructuredPostal.CONTENT_ITEM_TYPE};
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);
while (cursor.moveToNext()) {
String name = cursor.getString(1);
String mimetype = cursor.getString(2);
String data = cursor.getString(3);
// use the mimetype to figure out what kind of info is in this row
Log.i("Contact Info", contactId + "=> " + name + " - " + mimetype + ": " + data);
}
cursor.close();
}
我有代码可以使用联系人姓名作为选择从 Android 中获取联系人信息。但是,数据源(我猜应该是 ContactsContract.Contacts)没有我需要的有关联系人的所有信息。我看到联系信息分为几个表(ContactsContract.CommonDataKinds.StructuredName、ContactsContract.CommonDataKinds.Phone 等)。我还注意到所有这些来源都可以访问 LOOKUP_KEY 字段。它唯一标识一个联系人。我想知道是否有办法使用 LOOKUP_KEY.
对这些数据源执行连接下面,我目前为单个数据源设置投影和选择,并使用游标加载器异步查询它。有没有办法使用 LOOKUP_KEY?
一次搜索多个数据源private static final String[] CONTACT_PROJECTION = {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
ContactsContract.Contacts.HAS_PHONE_NUMBER
};
private static final String CONTACT_SELECTION = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
+ " LIKE ?";
public static Loader<Cursor> getContactLoader(Context applicationContext, String searchString) {
String[] selectionArgs = new String[1];
selectionArgs[0] = "%" + searchString + "%";
return new CursorLoader(
applicationContext,
ContactsContract.Contacts.CONTENT_URI,
CONTACT_PROJECTION,
CONTACT_SELECTION,
selectionArgs,
null
);
}
所有联系人的所有信息都分组在别名 table 中,它们实际上存储在一个名为 Data
的大 table 中,因此您可以简单地查询 [=17] =] 获取与特定联系人相关的所有信息(您可以使用 CONTACT_ID
,无需使用更麻烦的 LOOKUP_URI
),如下所示:
public void getContactInfo(long contactId) {
Uri uri = Data.CONTENT_URI;
String[] projection = new String[]{
Data.CONTACT_ID,
Data.DISPLAY_NAME,
Data.MIMETYPE,
Data.DATA1}; // you can get additional info if needed in Data.DATA2, DATA3, etc.
// get all relevant info about the contact
String selection = Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + " IN (?,?,?,?)"; // you can add more question marks if you need more MIMETYPES
String[] selectionArgs = new String[]{String.valueOf(contactId), Phone.CONTENT_ITEM_TYPE, Email.CONTENT_ITEM_TYPE, Event.CONTENT_ITEM_TYPE, StructuredPostal.CONTENT_ITEM_TYPE};
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);
while (cursor.moveToNext()) {
String name = cursor.getString(1);
String mimetype = cursor.getString(2);
String data = cursor.getString(3);
// use the mimetype to figure out what kind of info is in this row
Log.i("Contact Info", contactId + "=> " + name + " - " + mimetype + ": " + data);
}
cursor.close();
}