/ / Как да съхранявате обект ABRecordRef в CoreData - ios, iphone, core-data, nsmanagedobjectcontext

Как да съхранявате обект ABRecordRef в CoreData - ios, iphone, core-data, nsmanagedobjectcontext

Искам да запазя 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().