我希望通过以下方式加载多个联系人Xamarin.Contacts.AddressBook:
var loookupIDs = /* load 10 saved contact IDs */
var addressBook = new AddressBook(context) { PreferContactAggregation = true };
foreach(var id in loookupIDs)
{
var contact = addressBook.Load(id);
names.Add(contact.DisplayName);
}
Run Code Online (Sandbox Code Playgroud)
但是,这非常慢(在Android设备上测试) - 甚至只加载10个联系人.有没有办法批量加载,所以它更快?或者是使用特定于平台的API而不是Xamarin包装器的唯一选择.
是的,Xamarin.Mobile有点慢.它结合了所有可能的联系人(电话,邮件等)和所有可能的字段,这是Android参考手册不推荐的.
我建议您使用本机方式使用Cursor查询联系人并根据您的需要对其进行过滤.可悲的是,Xamarin dev混淆了所有常量,所以这不是一项微不足道的任务.
这是完整的例子
public class PhoneContactInfo
{
public string PhoneContactID { get; set; }
public string ContactName { get; set; }
public string ContactNumber { get; set; }
}
public IEnumerable<PhoneContactInfo> GetAllPhoneContacts(IEnumerable<int> filterIds = null)
{
Log.Debug("GetAllPhoneContacts", "Getting all Contacts");
var arrContacts = new System.Collections.Generic.List<PhoneContactInfo>();
PhoneContactInfo phoneContactInfo = null;
var uri = ContactsContract.CommonDataKinds.Phone.ContentUri;
string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id,
ContactsContract.Contacts.InterfaceConsts.DisplayName,
ContactsContract.CommonDataKinds.Phone.Number
};
//String[] strings = filterIds.Select(k => Convert.ToString(k)).ToArray();
//string whereClause = ContactsContract.Contacts.InterfaceConsts.Id + " = ? ";
var cursor = MainActivity.ContextHolder.ContentResolver.Query(uri, projection,
null,
null,
null);
cursor.MoveToFirst();
while (cursor.IsAfterLast == false)
{
int phoneContactID = cursor.GetInt(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id));
if (filterIds.Contains(phoneContactID))
{
String contactNumber = cursor.GetString(cursor.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));
String contactName = cursor.GetString(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName));
phoneContactInfo = new PhoneContactInfo()
{
PhoneContactID = Convert.ToString(phoneContactID),
ContactName = contactName,
ContactNumber = contactNumber
};
arrContacts.Add(phoneContactInfo);
}
cursor.MoveToNext();
}
cursor.Close();
cursor = null;
Log.Debug("GetAllPhoneContacts", "Got all Contacts");
return arrContacts;
}
Run Code Online (Sandbox Code Playgroud)
如果你想添加一些花哨的异步
public Task<IEnumerable<PhoneContactInfo>> GetAllPhoneContactsAsync(IEnumerable<int> filterIds)
{
return Task.FromResult(GetAllPhoneContacts(filterIds));
}
Run Code Online (Sandbox Code Playgroud)
另请看一下评论whereClause.您可以构造"SQL like"where子句,以使查询更快.只需构建一个包含几个'='和'或'的字符串
PS我没有衡量绩效差异,如果有人有正确的统计数据,我将不胜感激
| 归档时间: |
|
| 查看次数: |
2126 次 |
| 最近记录: |