Прямое взаимодействие: программно доступ к базе данных

Несмотря на то, что много общих задач базы данных Address Book зависят от взаимодействия с пользователем, в некоторых случаях подходящий для приложения должен взаимодействовать с базой данных Address Book непосредственно. Существует несколько функций в платформе Адресной книги, предоставляющих эту возможность.

Для обеспечения универсального пользовательского опыта важно использовать эти функции только, когда они являются надлежащими. Вместо того, чтобы использовать эти функции для создания новых контроллеров представления или навигации программа должна вызвать предоставленные контроллеры представления или навигации, когда это возможно. Для получения дополнительной информации посмотрите Взаимодействие с пользователем: Запрос и Отображение Данных.

Помните, что база данных Address Book в конечном счете принадлежит пользователю, таким образом, приложения должны бояться вносить неожиданные изменения в нее. Обычно изменения должны инициироваться или подтверждаться пользователем. Это - особенно истина для групп, потому что нет никакого интерфейса на устройстве для пользователя, чтобы управлять группами и отменить изменения Вашего приложения.

Используя идентификаторы записи

Каждая запись в базе данных Address Book имеет уникальный идентификатор записи. Этот идентификатор всегда относится к той же записи, если та запись не удалена, или данные сбрасываются. Идентификаторы записи могут быть безопасно переданы между потоками. Они, как гарантируют, не останутся тем же через устройства.

Рекомендуемый способ сохранить долгосрочную ссылку на определенную запись состоит в том, чтобы сохранить имя и фамилию или хеш имени и фамилии, в дополнение к идентификатору. Когда Вы ищете запись ID, сравниваете имя записи к Вашему сохраненному имени. Если они не соответствуют, используйте сохраненное имя, чтобы найти запись и сохранить новый ID для записи.

Для получения идентификатора записи записи используйте функцию ABRecordGetRecordID. Для нахождения записи лица идентификатором используйте функцию ABAddressBookGetPersonWithRecordID. Для нахождения группы идентификатором используйте функцию ABAddressBookGetGroupWithRecordID. Для нахождения записи лица по имени используйте функцию ABAddressBookCopyPeopleWithName.

Работа с записями лица

Можно добавить и удалить записи из базы данных Address Book с помощью функций ABAddressBookAddRecord и ABAddressBookRemoveRecord.

Существует два способа найти запись лица в базе данных Address Book: по имени, использование функции ABAddressBookCopyPeopleWithName, и идентификатором записи, с помощью функции ABAddressBookGetPersonWithRecordID. Для выполнения других видов поисков используйте функцию ABAddressBookCopyArrayOfAllPeople и затем отфильтруйте результаты с помощью NSArray метод filteredArrayUsingPredicate:, как показано в следующем листинге кода.

NSArray* allContacts = /* assume this exists */ ;
 
// Build a predicate that searches for contacts with at least one phone number starting with (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 как компаратор и контекст типа ABPersonSortOrdering. Желаемый порядок сортировки пользователя, как возвращено ABPersonGetSortOrdering, обычно предпочтительный контекст.

Следующий листинг кода показывает пример сортировки всей базы данных Address Book:

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.