Я хочу зберегти a ABRecordRef
Об'єкт, тобто у форматі <CPRecord: 0xa2a3500 ABPerson>
використовуючи 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"];
Я отримую аварію, кажучи
запис, який я прийняв як Datatype Integer32.
Припинення програми через невичерпаний виняток NSInvalidArgumentException
,
Причина: "Неприйнятний тип значення для атрибута: property = "запис"; бажаний тип = NSNumber; даний тип = __NSCFType; значення = .
Відповіді:
1 для відповіді № 1Спробуйте це,
ABRecordRef recordRef = CFArrayGetValueAtIndex(contactInfoArray, i);
ABRecordId recId = ABRecordGetRecordID(recordRef);
NSNumber *recordId = [NSNumber numberWithInt:(int)recId];
[contactsManagedObjectStrings setValue:recordId forKey:@"record"];
відтягнутися
//recordId is the value of record key from managedobject
ABRecordId recId = (ABRecordId)[recordId intValue];
ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(ddressBook, recId);
0 для відповіді № 2
Вам краще не вдарити ABRecordRef, але ви повинні зберегти ABRecordRefID у своїх корекційних каталогах. посилання який може дати вам більш детальну інформацію про це. Я завжди волію робити таким чином.
0 для відповіді № 3
Справа в тому, що ви зберігаєте посилання на об'єкт в базі даних. Посилання вказує на пам'ять, дійсну на тільки цей момент часу. Якщо ви зберігаєте посилання на об'єкт, а потім знову завантажуєте посилання з бази даних (особливо після перезавантаження додатка), це означатиме недійсну пам'ять.
Замість того, щоб зберігати фактичні дані з об'єкта в базу даних, а не посилання на об'єкт, або, можливо, ідентифікатор запису, як повернуто з ABRecordGetRecordID()
.