iOS开发文档翻译:iOS联系人开发指南/直接交互:使用代码来访问该数据库,Address Book Programming Guide for iOS/Direct Interaction: Programmatically Accessing the Database
尽管在大部分常见的联系人数据库访问任务中都需要用户的交互式参与,但是,在某些情况下,程序需要直接访问到联系人数据库。在联系人框架中,有多个函数都提供了这种能力。
为了提供一个统一的用户体验,要注意狠重要的一点事项,那就是,仅仅在必要的时候才使用这些函数。妳的程序中,应当尽可能是调用框架已提供的那些视图或导航控制器,而不是利用框架中提供的那些直接访问函数来创造出新的视图或导航控制器。欲知更多信息,则阅读“用户交互:提示用户选择数据并且显示数据。”
记住,联系人数据库终究是属于用户的,妳的程序应当注意不要对该数据库做出意料之外的修改。一般来说,变动应当由用户发起或由用户确认。对于联系人分组来说,尤其是如此,因为,在设备上没有任何界面可供用户来管理分组情况或者撤销妳的程序所做的修改。
使用记录标识符
联系人数据库中的每条记录都拥有一个唯一的记录标识符。这个标识符永远指向同一个记录,除非该记录本身被删除或者手机上的数据被重置。记录标识符可在不同线程间安全地传递。它们并不保证在不同的设备上还具有相同的值。
建议按照这种方式来长期记住某个特定的联系人记录:除了记住该标识符之外,还记住该联系人的姓和名,或者还记住该联系人的姓和名的散列值。当妳通过标识符来查找某个记录时,将该记录的名字与妳之前记住的名字做比较。如果它们不一致的话,则,使用之前记住的名字来查找对应的记录,并且记住该记录的新的标识符。
要获取某个记录的记录标识符,则使用ABRecordGetRecordID函数。要通过标识符来查找一个联系人记录,则使用ABAddressBookGetPersonWithRecordID函数。要通过标识符来查找一个联系人分组的话,则使用ABAddressBookGetGroupWithRecordID函数。要通过名字来查找一个联系人记录的话,则使用ABAddressBookCopyPeopleWithName函数。
使用联系人记录
妳可以使用ABAddressBookAddRecord 和ABAddressBookRemoveRecord 函数来向联系人数据库中添加记录或者从中删除记录。
可采用两种方法来从联系人数据库中查找一个联系人记录:使用ABAddressBookCopyPeopleWithName 函数来按照名字查找;或者,使用ABAddressBookGetPersonWithRecordID 函数来按照记录标识符来查找。要进行其它形式的查找,则,使用ABAddressBookCopyArrayOfAllPeople 函数,然后使用NSArray 的filteredArrayUsingPredicate:方法来对结果进行过滤,如下面代码所示。
NSArray* allContacts = /* 假设 这个东西存在 */ ;
// 构造一个判定,它会搜索那些至少有一个电话号码以(408)开头的联系人。
NSPredicate* predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary* bindings) {
ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);
BOOL result = NO;
for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
NSString* phoneNumber = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
if ([phoneNumber hasPrefix:@"(408)"]) {
result = YES;
break;
}
}
CFRelease(phoneNumbers);
return result;
}];
NSArray* filteredContacts = [allContacts filteredArrayUsingPredicate:predicate];
要想对一个联系人数组进行排序的话,则使用CFArraySortValues函数,并且传入ABPersonComparePeopleByName函数作为comparator(比较器),传入类型ABPersonSortOrdering 作为context(上下文)。用户所首先的排序方式,即,由ABPersonGetSortOrdering 所返回的排序方式,是常用的首先上下文。
以下代码清单中展示了一个示例,它对整个联系人数据库做了排序:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
kCFAllocatorDefault,
CFArrayGetCount(people),
people
);
CFArraySortValues(
peopleMutable,
CFRangeMake(0, CFArrayGetCount(peopleMutable)),
(CFComparatorFunction) ABPersonComparePeopleByName,
(void*) ABPersonGetSortOrdering()
);
CFRelease(addressBook);
CFRelease(people);
CFRelease(peopleMutable);
使用分组记录
妳可以通过ABAddressBookGetGroupWithRecordID 函数来以记录标识符找到某个特定的分组。另外,还可以使用ABAddressBookCopyArrayOfAllGroups 来获取联系人数据库中所有分组组成的数组,还可以使用ABAddressBookGetGroupCount 来获取联系人数据库中的分组的个数。
妳可以使用代码来修改某个分组中的成员的归属情况。要向某个分组中添加一个成员,则使用ABGroupAddMember 函数;要从某个分组中删除一个成员,则使用ABGroupRemoveMember 函数。
风筝
Your opinionsHxLauncher: Launch Android applications by voice commands