2014-01-30 2 views
0

Я хочу сохранить объект ABRecordRef i.e в формате <CPRecord: 0xa2a3500 ABPerson> с использованием Coredata.Как сохранить объект ABRecordRef в CoreData

В то время как я пытался сохранить как

NSEntityDescription *entityDescriptionStrings = [NSEntityDescription entityForName:@"ContactsStrings" inManagedObjectContext:context]; 

ContactsStrings *contactsManagedObjectStrings = [[ContactsStrings alloc] initWithEntity:entityDescriptionStrings insertIntoManagedObjectContext:context]; 

     ABRecordRef recordRef = CFArrayGetValueAtIndex(contactInfoArray, i); 
[contactsManagedObjectStrings setValue:(__bridge id)(recordRef) forKey:@"record"]; 

Я получаю аварии, говоря

запись я взял в качестве Integer32 DATATYPE.

Нагрузочное приложение из-за неперехваченное исключением NSInvalidArgumentException,

причина: «Недопустимый тип значения для атрибута: свойства = "записи"; желаемый тип = NSNumber; данный тип = __NSCFType; значение = .

+0

Попробуйте использовать '[NSNumber numberWithInt: (интермедиат) RecordRef]' вместо '(__bridge идентификатор) (RecordRef)' – Akhilrajtr

+0

@Akhilrajtr: Я мог бы сохранить это, но, как я могу вернуть объект ABrecordRef из NSNumber – iOSDev

ответ

0

Лучше, если вы не сохраните ABRecordRef, но вы должны сохранить ABRecordRefID в своих coredata. Вот link, который может дать вам более подробную информацию. Я всегда предпочитаю делать так.

0

Проблема в том, что вы храните ссылку на объект в базе данных. Ссылка указывает на память, которая действительна на только в тот момент времени. Если вы храните ссылку на объект и затем перезагрузите ссылку из базы данных (особенно после перезапуска приложения), она укажет на недопустимую память.

Вместо этого храните фактические данные от объекта в базе данных, а не ссылку на объект, или, возможно, идентификатор записи, возвращенный с ABRecordGetRecordID().

1

Попробуйте это,

ABRecordRef recordRef = CFArrayGetValueAtIndex(contactInfoArray, i); 
ABRecordId recId = ABRecordGetRecordID(recordRef); 
NSNumber *recordId = [NSNumber numberWithInt:(int)recId]; 
[contactsManagedObjectStrings setValue:recordId forKey:@"record"]; 

в retrive

//recordId is the value of record key from managedobject 
ABRecordId recId = (ABRecordId)[recordId intValue]; 
ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(ddressBook, recId); 
Смежные вопросы