2010-01-26 4 views
8

Al momento sono davvero in difficoltà con ABAddressBookGetPersonWithRecordID. Sto salvando un ID e poi provando a richiamarlo di nuovo. Attualmente sto facendo qualcosa di semplice per testare il collegamento, ma non funziona.rubrica iphone - recupero di oggetti null in ABAddressBookGetPersonWithRecordID

In primo luogo, posso leggere gli oggetti dal mio indirizzo di iphone simulatore libro utilizzando:

-(BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

    NSString *contactName; 
    NSString *contactCompany; 
    NSString *contactFirst; 
    NSString *contactLast; 


    contactFirst = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) stringByAppendingString:@" "];  
    contactLast = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
    contactName = [contactFirst stringByAppendingString:contactLast]; 

    contactCompany = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty); 


    NSNumber *recordId = [NSNumber numberWithInteger: ABRecordGetRecordID(person)]; 

    NSLog(@"record id is %d", recordId); 
    NSLog(@"Person Reference: %d", person); 
    NSLog(@"Name: %@", contactName); 
    NSLog(@"Company: %@", contactCompany); 

che ha la NSLog:

2010-01-26 11:52:31.396 SQL[19786:207] record id is 69283952 
2010-01-26 11:52:31.397 SQL[19786:207] Person Reference: 69495792 
2010-01-26 11:52:31.398 SQL[19786:207] Name: John Adams 
2010-01-26 11:52:31.398 SQL[19786:207] Company: (null) 

Quindi la mia presunzione è che tutte le opere in tal senso. Il problema sta utilizzando l''ID record' 69283952, per richiamare il backup di queste informazioni di contatto. Attualmente sto cercando di fare in questo modo:

-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)newindexPath { 


    ABAddressBookRef ab = ABAddressBookCreate(); 
    ABPersonViewController *pvc = [[ABPersonViewController alloc] init]; 

    ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,69283952); 
    NSLog(@"person - %d", person); 
    pvc.displayedPerson = person; 
    NSLog(@"pvc.displayedPerson - %d", pvc.displayedPerson); 
    pvc.addressBook = ab; 
    pvc.allowsEditing = YES; 
    pvc.personViewDelegate = self; 
    [[self navigationController] pushViewController:pvc animated:YES]; 
    [pvc release]; 

che ha la NSLog

2010-01-26 11:58:19.393 SQL[19849:207] Looking Up Contact Now 
2010-01-26 11:58:19.399 SQL[19849:207] person - 0 
2010-01-26 11:58:19.400 SQL[19849:207] pvc.displayedPerson - 0 

E così tutto quello che ottiene è una persona nullo. Che cosa sto facendo di sbagliato? Non ne ho assolutamente idea!

saluti, @norskben

risposta

7

NSNumber è un oggetto, non è un numero intero.

Per inserire un oggetto NSNumber in una stringa di formato (ad esempio per NSLog), è necessario utilizzare% @ (non% d).

NSNumber *recordId = [NSNumber numberWithInteger:ABRecordGetRecordID(person)]; 
NSLog(@"record id is %@",recordId); 

Allo stesso modo, se avete la recordID in un oggetto NSNumber, si può ottenere il valore intero utilizzando integerValue:

ABRecordRef person = ABAddressBookGetPersonWithRecordID(ab,recordId.integerValue); 
+0

interessante, quindi la recordId è un numero relativamente piccolo (ottengo 2), e niente come il vecchio 67238032. E ci vai, che piccola soluzione !!! grazie mille gerry3 – oberbaum

+0

Sì, 69283952 era il valore del puntatore (indirizzo di memoria) del tuo oggetto NSNumber. – gerry3

+0

hmmm ... questi puntatori continuano a ingannarmi. – oberbaum