如何在核心数据中存储ABRecordRef对象

时间:2014-01-30 10:02:51

标签: ios iphone core-data nsmanagedobjectcontext

我想使用Coredata存储ABRecordRef对象,格式为<CPRecord: 0xa2a3500 ABPerson>

虽然我试图存储像

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数据类型。

因未捕获的异常NSInvalidArgumentException终止应用,

  

原因:'属性的值不可接受:property =   “记录”;所需类型= NSNumber;给定type = __NSCFType;值=   

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

最好不要保存ABRecordRef,但是你应该在你的coredata中保存ABRecordRefID。这是link,它可以为您提供更多详细信息。我总是喜欢这样做。

答案 2 :(得分:0)

问题是您在数据库中存储对象引用。引用指向仅在该时间点处有效的内存。如果存储对象引用,然后再从数据库重新加载引用(特别是在应用程序重新启动后),它将指向无效的内存。

而是将对象的实际数据存储到数据库中,而不是从ABRecordGetRecordID()返回的对象引用或记录ID。