Искам да запазя 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"];
Получавам катастрофа
запис, който взех като Integer32 Datatype.
Прекратяване на приложението поради невъзможно изключение NSInvalidArgumentException
,
reason: "Неприемлив тип стойност за атрибут: 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 във вашето coredata. връзка което може да ви даде повече подробности в това. Винаги предпочитам да правя по този начин.
0 за отговор № 3
Проблемът е, че съхранявате референция на обект в базата данни. Позоваването посочва паметта, която е валидна в само този момент във времето, Ако съхранявате обектната референция и след това повторно презаредите референцията от базата данни (особено след рестартиране на приложението), тя ще сочи към невалидна памет.
Вместо това да съхранявате действителните данни от обекта в базата данни, а не обекта, или може би идентификационния номер на записа, който се връща от ABRecordGetRecordID()
.