ios - основные данные: почему иногда встречается "Имя сущности не должно быть ноль"?
Эй, ребята. Я пишу IOS-приложение, которое содержит несколько подпредставлений, которые могут быть индивидуально созданы одним нажатием кнопки. у каждого подпредставления есть экземпляр 'group', то есть сущность, сохраненная с помощью основных данных. "группа" находится во многих отношениях с "контактом". когда контакт перетаскивается в подпредставление, он сохраняется в основных данных для данной "группы". это отлично работает ровно 3 раза. каждый четвертый раз, когда контакт перетаскивается в другое подпредставление, происходит сбой приложения.
вот код:
- (void)fetchContacts {
if(personRecordIDsArray==nil) {
personRecordIDsArray = [[NSMutableArray alloc] init];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
[entity release];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
if (mutableFetchResults == nil) {
// Handle the error.
}
[error release];
[request release];
for (Contact *contact in mutableFetchResults) {
if(contact.belongsToGroup == group) {
[personRecordIDsArray addObject:contact.recordId];
}
}
}
NSLog(@"%d", [personRecordIDsArray count]);}
- (void)addContactsToGroup:(NSArray*)arrayOfPeople {
[self fetchContacts];
for(int i = 0; i<[arrayOfPeople count]; i++) {
ABRecordRef person = [arrayOfPeople objectAtIndex:i];
NSNumber *personRecordId = [NSNumber numberWithInteger:ABRecordGetRecordID(person)];
if(![self groupContainsContactWithRecordID:personRecordId]) {
NSString *compositeName = (NSString *)ABRecordCopyCompositeName(person);
//Here is when the error occurs:
Contact *contact = (Contact*)[NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:managedObjectContext];
contact.compositeName = compositeName;
contact.recordId = personRecordId;
contact.belongsToGroup = group;
NSError *error = nil;
if (![managedObjectContext save:&error]) {
NSLog(@"Error in addContactsToGroup!");}
[error release];
[personRecordIDsArray addObject:personRecordId];
}
}}
при попытке добавить контакт в группу появляется сообщение об ошибке:
2011-04-10 16: 16: 36.152 TestApp [796: 207] * Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Имя объекта не должно быть равно нулю".
Я действительно играл некоторое время и также не мог найти ничего подобного в Интернете. забавно, что ошибка всегда возникает в четвертый раз, когда контакт добавляется в другое подпредставление. Кто-нибудь есть идеи о том, как я могу это исправить? у меня действительно нет идей...
ох, и отладчик говорит:
#0 0x956e2156 in __kill
#1 0x956e2148 in kill$UNIX2003
#2 0x95774899 in raise
#3 0x9578a9b8 in abort
#4 0x91de4fda in __gnu_cxx::__verbose_terminate_handler
#5 0x0141c4e7 in _objc_terminate
#6 0x91de317a in __cxxabiv1::__terminate
#7 0x91de31ba in std::terminate
#8 0x91de32b8 in __cxa_throw
#9 0x0141c635 in objc_exception_throw
#10 0x00ce1486 in +[NSManagedObject(_PFDynamicAccessorsAndPropertySupport) classForEntity:]
#11 0x00ce11f6 in _PFFastEntityClass
#12 0x00d06e73 in +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
#13 0x00009a02 in -[GroupViewController addContactsToGroup:] at GroupViewController.m:152
#14 0x00002f31 in -[GrouperViewController dragingWillEnd:forContacts:atPosition:] at GrouperViewController.m:98
#15 0x0000cbb8 in -[ContactsTableViewController longPressOnView:] at ContactsTableViewController.m:65
1 ответ
Я собираюсь предположить, что проблема в том, что контекст управляемого объекта отделился от модели управляемого объекта, что делает невозможным для NSEntityDescription найти и вернуть класс, который должен представлять Contact
юридическое лицо.
Наиболее вероятной причиной этого будет инициализация контекста управляемого объекта, но не установка его модели или каким-либо образом установка модели на ноль. Я бы предложил полностью зарегистрировать контекст управляемого объекта перед выполнением вызова, который не удался. В частности, зарегистрируйте свою модель, чтобы убедиться, что она есть и что она остается неизменной от звонка к звонку.