Question

I have the following code :

ABAddressBookRef ab;
ab = ABAddressBookCreate();
int len = (int) ABAddressBookGetPersonCount(ab);
int i;
for(i = 1; i < (len + 1); i++)
{
  ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,(ABRecordID) i);
  CFStringRef firstName, lastName;
  firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
  lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
  static char* fallback = "";
  int fbLength = strlen(fallback);
  int firstNameLength = fbLength;
  bool firstNameFallback = true;
  int lastNameLength = fbLength;
  bool lastNameFallback = true;
  if (firstName != NULL)
  {
     firstNameLength = (int) CFStringGetLength(firstName);
     firstNameFallback = false;
  }
  if (lastName != NULL)
  {
     lastNameLength = (int) CFStringGetLength(lastName);
     lastNameFallback = false;
  }
  if (firstNameLength == 0)
  {
    firstNameLength = fbLength;
    firstNameFallback = true;
  }
  if (lastNameLength == 0)
  {
    lastNameLength = fbLength;
    lastNameFallback = true;
  }
  firstNameString = malloc(sizeof(char)*(firstNameLength+1));
  lastNameString = malloc(sizeof(char)*(lastNameLength+1));
  if (firstNameFallback == true)
  {
     strcpy(firstNameString, fallback);
  }
  else
  {
     CFStringGetCString(firstName, firstNameString, 10*CFStringGetLength(firstName), kCFStringEncodingASCII);
  }
  if (lastNameFallback == true)
  {
     strcpy(lastNameString, fallback);
  }
  else
  {
     CFStringGetCString(lastName, lastNameString, 10*CFStringGetLength(lastName), kCFStringEncodingASCII);
  }


   printf("%d.\t%s %s\n", i, firstNameString, lastNameString);
   NSString *fname= [NSString stringWithFormat:@"%s",firstNameString];
   NSString *lname= [NSString stringWithFormat:@"%s",lastNameString];
  [dict setValue:fname forKey:@"fname"];
  [dict setValue:lname forKey:@"lname"];
  [self.arrname addObject:[dict copy]];

if (firstName != NULL)
{
    CFRelease(firstName);
}
if (lastName != NULL)
{
    CFRelease(lastName);
}

free(firstNameString);
free(lastNameString);

}

it working well for first time.

But When i delete record from contact list and then try to add record my App crase at the following statement.

firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

Can anyone solve this problem ?? Any Idea is greatly appreciated.

Was it helpful?

Solution

There's no guarantee that the valid ABRecordID starts at 1 and ends at ABAddressBookGetPersonCount(addressBook). You can't use the for-loop using ABRecordID.

Instead, obtain the CFArray containing all the people using ABAddressBookCopyArrayOfAllPeople and iterate on it.

Another comment is that you shouldn't use C string; most of the things can be done using the API of CFString and NSString, which supports Unicode out of the box. By getting the C string specifying kCFStringEncodingASCII, you're basically destroying letters like é or ü, ગુજરાતી or 案. (Note that CFStringGetCString with kCFStringEncodingASCII is quite picky and removes characters not in the ASCII; it doesn't give you UTF8 representation of the string.) There're many people whose name contains non-ASCII characters. So, please do learn CFString and NSString methods. Note that a CFStringRef and an NSString* can be freely interchanged.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top