2012-12-23 3 views
6

Sto cercando di ottenere Nome gruppo ma dopo molte chiamate questo metodo "dall'utente per ricaricare i contatti" fornisce il valore nil e il seguente errore.ABAddressBookCreate(), ABAddressBookGetGroupCount, ... return @ "0x00000000 <nil>"?

-(void) getGroupsName 
    { 
     [groupsName removeAllObjects]; 
     //address book object to interact with iPhone contacts. 
     ABAddressBookRef addressbook = ABAddressBookCreate(); 
     //get groups count 
     CFIndex groupsCount   = ABAddressBookGetGroupCount(addressbook); 
     //get all available groups as array 
     CFArrayRef allGroups   = ABAddressBookCopyArrayOfAllGroups(addressbook); 

     for (int i = 0; i<groupsCount; i++) { 
      //get group of index=i from groups array 
      ABRecordRef group = CFArrayGetValueAtIndex(allGroups, i); 
      //get group name, I use __bridge_transfer to transfer from C to objective-c. 
      [groupsName addObject:(__bridge_transfer NSString*)ABRecordCopyCompositeName(group)]; 

     } 
     CFRelease(allGroups); 
     CFRelease(addressbook); 
    } 
////////////////////////////////////////////////////////////// 

    warning: Could not compile statement PRAGMA journal_mode = wal;: unable to open database file error 14 creating properties table: unable to open database file warning: Could not compile statement SELECT value FROM _SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement SELECT value FROM _SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement SELECT value FROM 
_SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement SELECT ROWID, First, Last, Middle, NULL, NULL, NULL, Organization, NULL, NULL, Kind, NULL, NULL, Nickname, Prefix, Suffix, FirstSort, LastSort, CreationDate, ModificationDate, CompositeNameFallback, NULL, StoreID, NULL, FirstSortSection, LastSortSection, FirstSortLanguageIndex, LastSortLanguageIndex, NULL, NULL, NULL, PersonLink, NULL, IsPreferredName FROM ABPerson;: unable to open database file warning: Could not compile statement SELECT ROWID, First, Last, Middle, NULL, NULL, NULL, Organization, NULL, NULL, Kind, NULL, NULL, Nickname, Prefix, Suffix, FirstSort, LastSort, CreationDate, ModificationDate, CompositeNameFallback, NULL, StoreID, NULL, FirstSortSection, LastSortSection, FirstSortLanguageIndex, LastSortLanguageIndex, NULL, NULL, NULL, PersonLink, NULL, IsPreferredName FROM ABPerson;: unable to open database file warning: Could not compile statement INSERT OR REPLACE INTO _SqliteDatabaseProperties VALUES (?, ?);: unable to open database file warning: Could not compile statement SELECT value FROM 
_SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement INSERT OR REPLACE INTO 
_SqliteDatabaseProperties VALUES (?, ?);: unable to open database file warning: Could not compile statement SELECT value FROM 
_SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement SELECT value FROM 
_SqliteDatabaseProperties WHERE key = ?;: unable to open database file warning: Could not compile statement SELECT ROWID FROM ABGroup;: unable to open database file warning: Could not compile statement SELECT ROWID, Name, ExternalIdentifier, StoreID, NULL, NULL, NULL FROM ABGroup;: unable to open database file 

Così uso la notifica nativo di farmi sapere quando addressbook ottenere modificato per diminuire il numero di tempo accedo al addressbook, ma ancora non va bene per il momento se l'utente fare molti aggiornamenti ed ogni tempo addrssbook get modificato deve chiamare questo meathod o qualsiasi altro relativo a addressbook.

quindi hai ancora bisogno del tuo aiuto ???

+0

Vedere http://stackoverflow.com/questions/13053976/catch-22 -accordo-alla-documentazione-per-indirizzo-libro-uso-con-ios-6 – rmaddy

+0

@rmaddy non è lo stesso, il mio codice ottiene tutti i contatti alla prima volta e ogni volta ma, ho il pulsante di ricarica quando l'utente fa clic più di 20 volte restituisce l'errore sopra – Omarj

+0

Mi spiace, non mi ero reso conto che avevi il problema solo dopo molte iterazioni. – rmaddy

risposta

0

Perché non Tring per ridurre al minimo il numero di volta che si crea e accedere al ABAddressBookRef utilizzando il seguente:

void ABAddressBookRegisterExternalChangeCallback (
    ABAddressBookRef addressBook, 
    ABExternalChangeCallback callback, 
    void *context 
); 

questo permetterà al vostro app sapere quando l'indirizzo viene modificato da external. e per farti sapere che è necessario accedere nuovamente alla rubrica.

La stessa cosa per il metodo che si registra, ogni volta che si chiama creerà nuovo oggetto con il nuovo accesso alla rubrica

+1

thx è lavoro per me, per ora nessun crash e no SQL warring :) – Omarj

1

ABAddressBookCreate è stato decrecato in iOS6. Utilizzare ABAddressBookCreateWithOptions, restituirà un oggetto CFErrorRef se non si ha accesso alla rubrica.

+0

mi danno ancora lo stesso problema dopo aver chiamato il metodo molte volte restituirà null quindi penso che dal sdk sia auto ?? – Omarj

+0

Hai provato a guardare CFErrorRef? –

+0

come si vede è un avviso non è un errore quindi non può registrarlo o fare qualsiasi sottile per & errore – Omarj

-1

Come sottolineato da @thelaws, è necessario utilizzare ABAddressBookCreateWithOptions in IOS6. if ([[[UIDevice currentDevice] VersioneSistema] floatValue]> 5.1) {

ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL); 
    __block BOOL accessGranted = NO; 
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
     ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error) { 
      // First time access has been granted, add the contact 
      accessGranted = granted; 
     }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)  { 
     // The user has previously given access, add the contact 
     accessGranted = YES; 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user to change privacy setting in settings app 
    } 
    if (accessGranted) { 
// your code goes here 
} 
} 
else { 
// your code goes here 
} 

Un'altra cosa è avete inizializzato, GROUPSNAME da qualche parte? ..

A prescindere da esso, stai usando ABExternalChangeCallBack per ottenere Notifica di cambio indirizzo?

Penso che dovresti inserire il codice di gruppo nello stesso modulo, dove stai accedendo ai contatti. (! Se questo non ti aiuta, non chiarire)

+0

prima cosa yeas io uso ABExternalChangeCallBack e questo mi danno più 10 volte per evitare crash "quando l'utente aggiorna poi l'app riceve notifica. riaccedere alla rubrica se questo è accaduto per più volte ". Secondo: è lo stesso per ottenere contatti se lo chiedo più volte sarà crash o tornare a me nil valore. ( – Omarj

+1

Corretto in linea di principio, ma -1 per prendere il floatValue della versione di sistema.Non è il modo consigliato per verificare la disponibilità dell'API. –