I am working on a chat application. Why do I need to save contacts. Therefore, I save all contacts from ABAddressBook in my main data object. The problem is, how can I know if the contact is changed or deleted from the iPhone address book? . So I will modify or delete this contact from my main data object.
if ABRecordGetRecordID(person) can be used as unique key or not
This belew is the code for adding contacts to the master data.
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBookRef ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBookRef ); for ( int i = 0; i < nPeople; i++ ) { ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i ); } NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); if ([firstName hasPrefix:@"Protected by True"]) { continue; } else if([firstName hasPrefix:@"Identified As Spam"]) { continue; } NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty); NSString *userEmail = nil; ABMultiValueRef emailData = ABRecordCopyValue(person, kABPersonEmailProperty); if(ABMultiValueGetCount(emailData) > 0) { NSLog(@"email is:%@",(__bridge NSString *)ABMultiValueCopyValueAtIndex(emailData, 0)); userEmail = (__bridge NSString *)ABMultiValueCopyValueAtIndex(emailData, 0); } NSString* phone = nil; ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,kABPersonPhoneProperty); if (ABMultiValueGetCount(phoneNumbers) > 0) { for (int i=0; i<ABMultiValueGetCount(phoneNumbers); i++) { phone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i); NSString *asciiCharacters = @"0123456789"; NSCharacterSet *nonAsciiCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:asciiCharacters] invertedSet]; NSString *stringPhone = [[phone componentsSeparatedByCharactersInSet:nonAsciiCharacterSet] componentsJoinedByString: @""]; NSString *str = stringPhone; stringPhone = [str stringByReplacingOccurrencesOfString:@"^0+" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, str.length)]; NSLog(@"modified %@", stringPhone); NSString *phoneLabelLocalized; CFStringRef labelStingRef = ABMultiValueCopyLabelAtIndex (phoneNumbers, i); phoneLabelLocalized = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(labelStingRef); if ([[PersistentStore getMyJID] rangeOfString:stringPhone].location != NSNotFound) { NSLog(@"my phone %@",stringPhone); continue; } NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:appDelegate.managedObjectContext]; request.predicate = [NSPredicate predicateWithFormat:@"contactNumber = %@", stringPhone]; NSError *executeFetchError = nil; Contact *contact = [[appDelegate.managedObjectContext executeFetchRequest:request error:&executeFetchError] lastObject]; if (!contact) { contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:appDelegate.managedObjectContext]; [contact setContactFirstName:firstName]; [contact setContactLastName:lastName]; if (firstName && lastName) { [contact setContactFullName:[NSString stringWithFormat:@"%@ %@",firstName,lastName]]; } else if(firstName) { [contact setContactFullName:firstName]; } else { [contact setContactFullName:lastName]; } [contact setContactType:phoneLabelLocalized]; [contact setContactDate:[NSDate date]]; [contact setContactOriginalNumber:phone]; [contact setContactNumber:stringPhone]; [contact setContactEmail:userEmail]; [arrayContacts addObject:stringPhone]; } } } CFRelease(phoneNumbers); NSError *error; if (![appDelegate.managedObjectContext save:&error]) {
iphone contacts abaddressbook abrecord abperson
Gagan joshi
source share