0

我正在为一个应用程序进行联系人操作。我的要求是保持与本机电话簿相同的顺序。如果本机有一些变化,通过某个字段和某个订单规范进行一次提取,我应该直接了解存在的位置或要插入的位置。

在本机电话簿上应用 ABPersonComparePeopleByName 排序。发现,首先按名字排序,然后是姓氏,最后是电话号码。如果联系人中没有名字,则将按顺序首先列出具有名字的联系人。

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
                                                               kCFAllocatorDefault,
                                                               CFArrayGetCount(people),
                                                               people
                                                               );

CFArraySortValues(
                      peopleMutable,
                      CFRangeMake(0, CFArrayGetCount(peopleMutable)),
                      (CFComparatorFunction) ABPersonComparePeopleByName,
                      (void*) ABPersonGetSortOrdering()
                      );

在本地电话簿上,给

NSFetchRequest* contactReq = [[NSFetchRequest alloc] init];
[contactReq setSortDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES selector:@selector(caseInsensitiveCompare:)],[NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES selector:@selector(caseInsensitiveCompare:)],[NSSortDescriptor sortDescriptorWithKey:@"phoneNumber" ascending:YES selector:@selector(caseInsensitiveCompare:)], nil]];

问题是,我在本地电话簿上获得的第一个联系人既没有名字也没有姓氏。其中,它们是本地电话簿上的最后一个条目。

所以,我要求我应该指定哪种排序来获取电话簿排序。

谢谢,文奇

4

1 回答 1

0

我可以删除它,但这个答案可能会解决iOS中联系人排序的困难和发生的事情。

  1. 为程序员提供了名字和姓氏作为他/她可以指定的选项(优先顺序也是如此)。
  2. 如果名字和姓氏不可用,它在内部使用电话号码。
  3. 我猜它对字符有偏好级别,即'#' or '$'底部带有前缀的联系人。
  4. 如果 name 的前缀是 ,真的很难弄清楚顺序'(', ')', '"', '*' etc
  5. 我认为还考虑了创建联系人的时间,即我添加了一个带有'('前缀的联系人,它放在旁边')',后来我添加了一个')'放在之前添加之后的联系人'('。优先级可以分组,不确定,但它有点复杂和封闭。
于 2013-05-10T12:34:58.990 回答