I am working on a business card reader apps. When I read a card, I get a string object from OCR output. I separate string as different other string as like as name, address, phone no, email and web address. But my problem is here that I can't send those string in corresponding field of ABNewPersonViewController class.
            Asked
            
        
        
            Active
            
        
            Viewed 655 times
        
    3
            
            
        
        TylerH
        
- 20,799
 - 66
 - 75
 - 101
 
        Lutful Kabir
        
- 119
 - 6
 
- 
                    Did you read the [documentation](http://developer.apple.com/library/ios/#documentation/AddressBookUI/Reference/ABNewPersonViewController_Class/Reference/Reference.html)? There is a property called [`displayedPerson`](http://developer.apple.com/library/ios/#documentation/AddressBookUI/Reference/ABNewPersonViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/ABNewPersonViewController/displayedPerson) which takes a [`ABRecordRef`](http://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABRecordRef_iPhoneOS/Reference/reference.html) – rckoenes Oct 22 '12 at 12:28
 
1 Answers
1
            
            
        see code below. It's a detailed code.
-(NSUInteger)addNewContacts_InAddressBook:(NSMutableArray*)contactsToBeAdded
{
    int numContacts=[contactsToBeAdded count];
    if (numContacts==0) 
    {
        return 0;
    }
    int32_t uniqueId;
    @try 
    {
        ABAddressBookRef iphoneAddressBook=ABAddressBookCreate();
        CFErrorRef error = NULL; 
        if(!iphoneAddressBook)
        {
            DLog(@"unable to open addressBook");
            return 0;
        }
        NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
        [inFormat setDateFormat:@"yyyy-MM-dd"];
        [inFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
        NSAutoreleasePool* pool=[[NSAutoreleasePool alloc] init];
        NSMutableArray *recordRefArray=[[NSMutableArray alloc] initWithCapacity:numContacts];
        BOOL shouldReleasePool=NO;
        NSAutoreleasePool *innerPool=nil;
        for(int j=0;j<numContacts;j++)
        {
            if((j&255)==0)
            {
                innerPool= [[NSAutoreleasePool alloc] init];
                shouldReleasePool=YES;
            }
            Contact *objContact=[contactsToBeAdded objectAtIndex:j];
            ABRecordRef newPerson = ABPersonCreate();
            if(objContact.mPrefixName!=nil)
            {   
                if([objContact.mPrefixName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonPrefixProperty, (CFStringRef)objContact.mPrefixName , &error);
                }
            }
            if(objContact.mFirstName!=nil)
            {   
                if([objContact.mFirstName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (CFStringRef)objContact.mFirstName , &error);
                }
            }
            if(objContact.mMiddleName!=nil)
            {   
                if([objContact.mMiddleName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonMiddleNameProperty, (CFStringRef)objContact.mMiddleName , &error);
                }
            }
            if(objContact.mLastName!=nil)
            {   
                if([objContact.mLastName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonLastNameProperty, (CFStringRef)objContact.mLastName , &error);
                }
            }
            if(objContact.mNickName!=nil)
            {   
                if([objContact.mNickName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonNicknameProperty, (CFStringRef)objContact.mNickName , &error);
                }
            }
            if(objContact.mSuffixName!=nil)
            {   
                if([objContact.mSuffixName isEqualToString:@""]==FALSE)
                {
                    ABRecordSetValue(newPerson, kABPersonSuffixProperty, (CFStringRef)objContact.mSuffixName , &error);
                }
            }
            // Storing user photo into address book
            if(objContact.mUserPhotoData)
            {
                if ([objContact.mUserPhotoData length] > 0)
                    ABPersonSetImageData(newPerson, (CFDataRef)objContact.mUserPhotoData, &error);
            }
            ContactProperty *objContactProperty;
            int numProps=[objContact.mPropertyArray count];
            ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiUrl = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            NSMutableDictionary *addressDictionary=[[NSMutableDictionary alloc] init];
            ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
            BOOL notFirstTime=NO;
            int currentPropertyIndex=-1;
            NSString *displayName;
            ABMutableMultiValueRef multiDate = ABMultiValueCreateMutable(kABMultiStringPropertyType);
            ABMutableMultiValueRef multiIM = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
            NSMutableDictionary *IMDictionary;
            for(int i=0;i<numProps;i++)
            {
                objContactProperty=[objContact.mPropertyArray objectAtIndex:i];
                int PID=objContactProperty.mContactPropId;
               // if([objContactProperty.mContactDataType compare:@"Text"]==NSOrderedSame)
                //{
                if (PID==3) 
                {
                    if(objContactProperty.mContactPropertyString)
                    {
                      //  DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonOrganizationProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }
                }
               // }
            ///\/\/\/\/\/\/\/\/
                if(PID==1901)
                {
                        if(objContactProperty.mContactPropertyString)
                        {
                       //     DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                            ABRecordSetValue(newPerson, kABPersonNoteProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                        }
                 }
                if(PID==4)
                {   
                        if(objContactProperty.mContactPropertyString)
                        {
                 //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                            ABRecordSetValue(newPerson, kABPersonFirstNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                        }
                }
                if(PID==5)
                {   
                    if(objContactProperty.mContactPropertyString)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonLastNamePhoneticProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }
                }
                if(PID==6)
                {   
                    if([objContactProperty.mContactPropertyString length]>=1)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonJobTitleProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }
                }
                if(PID==7)
                {   
                    if(objContactProperty.mContactPropertyString)
                    {
                        //           DLog(@"Saving Into AddressBook: Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABRecordSetValue(newPerson, kABPersonDepartmentProperty, (CFStringRef)objContactProperty.mContactPropertyString, &error);
                    }
                }
            //Adding phone numbers
                //if([objContactProperty.mContactDataType compare:@"Phone"]==NSOrderedSame)
                if(PID>10 && PID<=200)
                {
      //              if(objContactProperty.mContactPropertyString)
      //              {
              //          DLog(@"Label : %@  Value : %@",objContactProperty.mDisplayName,objContactProperty.mContactPropertyString);
                        ABMultiValueAddValueAndLabel(multiPhone, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
     //               }
                }
            //Adding emails
         //       if([objContactProperty.mContactDataType compare:@"Email"]==NSOrderedSame)
                if(PID>300 && PID<=320)
                {
                        ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"home", NULL);
                }
                else if(PID>320 && PID<=340)
                {
                    ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, @"work", NULL);
                }
                else if(PID>340 && PID<=400)
                {
                    ABMultiValueAddValueAndLabel(multiEmail, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
                }
            //Adding web URLs
     //           if([objContactProperty.mContactDataType compare:@"Url"]==NSOrderedSame)
                if(PID>500  && PID<=600)
                {
     //               if(objContactProperty.mContactPropertyString)
     //               {
                        ABMultiValueAddValueAndLabel(multiUrl, objContactProperty.mContactPropertyString, (CFStringRef)objContactProperty.mDisplayName, NULL);
     //               }
                }
            //ADDRESSES
                if (PID>700 && PID<=1300) 
                {
                    int propertyIndex=(PID-1)/10;  //To adjust for 710 to fall into category of (710-1)/10=70 instead of 71.
                    if (propertyIndex!=currentPropertyIndex) 
                    {
                        if (notFirstTime) 
                        {
                            bool didAddAddress;
                            if(currentPropertyIndex*10<901)
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
                            else if(currentPropertyIndex*10<1101)
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
                            else
                                didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, displayName, NULL);
                            [addressDictionary release];
                            addressDictionary = [[NSMutableDictionary alloc] init];
                        }
                        currentPropertyIndex=propertyIndex;
                        notFirstTime=YES;
                    }
                    displayName=[NSString stringWithString:objContactProperty.mDisplayName];
                    switch (PID%10) 
                    {
                        case 1:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonAddressStreetKey];
                            break;
                        case 2:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCityKey];
                            break;
                        case 3:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressStateKey];
                            break;
                        case 4:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressZIPKey];
                            break;
                        case 5:
                            [addressDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *)kABPersonAddressCountryKey];
                            break;
                        default:
                            break;
                    }
                }
                //DATE AND BIRTHDAY
                    NSDate *ddate;
                    if (PID>1400 && PID<=1500) 
                    {
                        switch (PID) 
                        {
                            case 1401:
                                ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
                                ABRecordSetValue(newPerson, kABPersonBirthdayProperty, ddate , &error);
                                break;
                            default:
                                ddate=[inFormat dateFromString:[objContactProperty.mContactPropertyString substringToIndex:10]];
                                ABMultiValueAddValueAndLabel(multiDate, ddate, (CFStringRef)objContactProperty.mDisplayName, NULL);
                                break;
                        }
                    }
                //INSTANT MESSAGE
                    if (PID>1600 && PID<=1800) 
                    {
                        switch (PID%2) 
                        {
                            case 1:
                                IMDictionary=[[NSMutableDictionary alloc] init];
                                [IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageUsernameKey];
                                break;
                            case 0:
                                [IMDictionary setObject:objContactProperty.mContactPropertyString forKey:(NSString *) kABPersonInstantMessageServiceKey];
                                ABMultiValueAddValueAndLabel(multiIM, IMDictionary, (CFStringRef)objContactProperty.mDisplayName, NULL);
                                [IMDictionary release];
                            default:
                                break;
                        }
                    }
            }
            if ([addressDictionary count]!=0) 
            {
                bool didAddAddress;
                NSRange range1,range2;
                range1=[displayName rangeOfString:@"home" options:NSCaseInsensitiveSearch];
                range2=[displayName rangeOfString:@"work" options:NSCaseInsensitiveSearch];
                if (range1.location!=NSNotFound)
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
                else if (range2.location!=NSNotFound)
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);
                else
                    didAddAddress = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, (CFStringRef)displayName, NULL);
            }
            [addressDictionary release];
            ABRecordSetValue(newPerson, kABPersonAddressProperty, multiAddress, NULL);
            CFRelease(multiAddress);
            DLog(@"Saving Phone Numbers");
            ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil);
            CFRelease(multiPhone);
            ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail,nil);
            CFRelease(multiEmail);    
            ABRecordSetValue(newPerson, kABPersonURLProperty, multiUrl,nil);
            CFRelease(multiUrl);
            ABRecordSetValue(newPerson, kABPersonDateProperty, multiDate,nil);
            CFRelease(multiDate);
            ABRecordSetValue(newPerson, kABPersonInstantMessageProperty, multiIM, NULL);
            CFRelease(multiIM);
            bool outcome=ABAddressBookAddRecord(iphoneAddressBook, newPerson, &error);
#ifdef  ENABLE_DEBUG_CONSOLE_OUTPUT           
            if(outcome==FALSE)
                DLog(@"RECORD COULD NOT BE ADDED TO THE ADDRESSBOOK");
#endif
            [recordRefArray addObject:newPerson];
            CFRelease(newPerson);
            if(shouldReleasePool)
            {
                [innerPool release];
                shouldReleasePool=NO;
            }
        }
        DLog(@"Saving AddressBook");
        DBManager *dbManager=[DBManager getInstance];
        [dbManager setFLAGIsSavingAddressBook:YES];
        bool outcome=ABAddressBookSave(iphoneAddressBook, &error);
        [dbManager setFLAGIsSavingAddressBook:NO];
        [[NSNotificationCenter defaultCenter] postNotificationName:ADDRESSBOOK_DONE_SAVING object:nil];
#ifdef  ENABLE_DEBUG_CONSOLE_OUTPUT 
        if(outcome==FALSE)
            DLog(@"ADDRESSBOOK COULD NOT BE SAVED");
#endif
        for(int i=0;i<numContacts;i++)
        {
            uniqueId=ABRecordGetRecordID([recordRefArray objectAtIndex:i]);
            Contact *objContact=[contactsToBeAdded objectAtIndex:i];
            objContact.addressBookId=uniqueId;
            DLog(@"Adding multiple records at once. The LID for the newly added record is: %i",uniqueId);
        }
        [recordRefArray release];
        //Initializing new addressBook id in contact
        //objContact.addressBookId=uniqueId;
        CFRelease(iphoneAddressBook);
        [pool release];
        [inFormat release];
    }
    @catch (NSException * e) 
    {
        DLog(@"Exception in addNewContactInAddressBook ");
    }
    @finally {
    }
    return 0;
//  
    return uniqueId;
    }
        Saad
        
- 8,857
 - 2
 - 41
 - 51