Основные отношения данных вызывают ошибку сохранения после удаления
Этот вопрос, вероятно, длинный выстрел. Я не могу понять, какие ошибки я получаю в своем проекте с основными данными при сохранении после удаления объекта.
У меня есть две основные сущности, с которыми я работаю: наряд и статья. Я могу создать их без проблем, но когда я их удаляю, я получаю следующий журнал ошибок:
Для одежды:
2009-09-22 20:17:37.771 itryiton[29027:20b] Operation could not be completed. (Cocoa error 1600.)
2009-09-22 20:17:37.773 itryiton[29027:20b] {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
NSValidationErrorKey = outfitArticleViewProperties;
NSValidationErrorObject = <Article: 0x12aa3c0> (entity: Article; id: 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1> ; data: {
articleID = 2009-09-22 19:05:19 -0400;
articleImage = 0x12b4de0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/ArticleImage/p1>;
articleType = nil;
attributeTitles = "(...not nil..)";
color = nil;
comment = nil;
dateCreated = 2009-09-22 19:05:19 -0400;
designer = nil;
imageView = "(...not nil..)";
location = "(...not nil..)";
outfitArticleViewProperties = (
0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1>
);
ownesOrWants = 0;
pattern = nil;
price = nil;
retailer = nil;
thumbnail = "(...not nil..)";
washRequirements = nil;
wearableSeasons = nil;
});
NSValidationErrorValue = {(
<OutfitArticleViewProperties: 0x1215340> (entity: OutfitArticleViewProperties; id: 0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1> ; data: {
article = 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1>;
articleViewPropertiesID = nil;
outfit = nil;
touch = nil;
view = "(...not nil..)";
})
)};
}
И если я удалю статью, я получу:
2009-09-22 18:58:38.591 itryiton[28655:20b] Operation could not be completed. (Cocoa error 1560.)
2009-09-22 18:58:38.593 itryiton[28655:20b] DetailedError: {
NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
NSValidationErrorKey = articleImage;
NSValidationErrorObject = <Article: 0x12aa340> (entity: Article; id: 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1> ; data: {
articleID = 2009-09-22 18:58:26 -0400;
articleImage = 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1>;
articleType = nil;
attributeTitles = "(...not nil..)";
color = nil;
comment = nil;
dateCreated = 2009-09-22 18:58:26 -0400;
designer = nil;
imageView = "(...not nil..)";
location = "(...not nil..)";
outfitArticleViewProperties = (
0x12b5010 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/OutfitArticleViewProperties/p1>
);
ownesOrWants = 0;
pattern = nil;
price = nil;
retailer = nil;
thumbnail = "(...not nil..)";
washRequirements = nil;
wearableSeasons = nil;
});
NSValidationErrorValue = <ArticleImage: 0x12ad600> (entity: ArticleImage; id: 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1> ; data: {
article = 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1>;
image = "(...not nil..)";
});
}
Ошибка 1600:
NSValidationRelationshipDeniedDeleteError
Код ошибки для обозначения некоторых отношений
с правилом удаления NSDeleteRuleDeny есть
не пусто.
Доступный в Mac OS X v10.4 и позже.
Объявлен в CoreDataErrors.h.
Но я не вижу на всю жизнь, какие отношения будут препятствовать удалению. Если какой-нибудь мастер Core Data увидит ошибку моих путей, я буду унижен.
Я не могу отметить это как решенное, потому что я действительно не решил это, но у меня есть обходной путь. В .m
для каждого из моих managedObjects
объектов я добавил метод, который выглядит следующим образом:
-(void) deleteFromManangedObjectContext{
self.outfit = nil;
self.article = nil;
[[self managedObjectContext] deleteObject:self];
}
Итак, вы можете видеть, сначала я вручную обнуляю отношения, а затем у меня есть объект, который удаляется сам. В других объектах вместо nil-ing
мой метод удаления вызывается для некоторых отношений объектов, чтобы получить каскад.
Ответы
Ответ 1
Я не могу отметить это решение, потому что я его действительно не решал, но у меня есть рабочая работа. В .m для каждого из моих управляемых объектов я добавил метод, который выглядит так:
-(void) deleteFromManangedObjectContext{
self.outfit = nil;
self.article = nil;
[[self managedObjectContext] deleteObject:self];
}
Итак, вы можете видеть, сначала я вручную отключил отношения, а затем у меня есть объект, который сам удалит. В других объектах вместо nil-ing мой метод удаления вызывается для некоторых отношений объектов, чтобы получить каскад.
Меня все еще интересует "правильный" ответ. Но это лучшее решение, которое у меня есть, и это позволяет некоторым мелким образом контролировать, как мои отношения удаляются.
Ответ 2
У меня просто была проблема с удалением, и я приземлился на этот вопрос. И я выяснил свою проблему и подумал, что я тоже поделюсь этим, и, возможно, у кого-то будет такая же проблема.
Ошибка, которую я совершил, заключается в том, что объект (A), который я пытаюсь удалить, имеет отношение к другому объекту (B) с NULL как правило удаления. Однако объект B также имеет отношение к A и не является необязательным. Поэтому, когда я удаляю A, отношение B от A становится null, которое недопустимо. Когда я меняю правило удаления на каскад, и это сработало.
Ответ 3
Случалось ли вам реализовать часть аксессуаров для отношений самостоятельно?
У меня когда-то был код вроде
-(NSSet*)articles
{
re-calculates properties....
return [self primitiveValueForKey:@"articles"];
}
в подклассе NSManagedObject и имеет ошибку сохранения.
Случилось так, что, когда этот объект удаляется из ManagedObjectContext, CoreData вызывает "статьи" доступа для борьбы с распространением delete. Этот перерасчет статей произошел во время распространения удаления, что в моем случае повторило аннулированные "статьи".
Ответ 4
Проверьте файл xcdatamodel
для правила удаления Deny
. Нажмите на каждую связь, пока не найдете ее. Вам нужно будет изменить это правило или настроить, как удалить управляемые объекты, чтобы предвидеть приложение правила в отношении.
Ответ 5
У меня была аналогичная проблема, когда выяснилось, что проблема была в файле .xib. Когда я включил флажок "Удаляет объекты при удалении" (под Bindings- > Content Set) соответствующего контроллера массива, проблема исчезла.
Не знаю, поможет ли это в вашем случае, но у меня было много волос, серых над проблемами, которые, как оказалось, были скрыты где-то внутри Interface Builder.
Ответ 6
В моем случае я невинно создал собственный метод в моем подклассе NSManagedObject: isDeleted. Я столкнулся с необычными исключениями для сохранения, пока я не удалил/не переименовал его.
Потеряв рассудок, на этот раз я снова прочитал документацию.
Оказалось, что я переопределил один из методов NSManagedObject, который НЕ ДОЛЖЕН ПЕРЕКРЫТЬ.
Проверьте, помогает ли эта выдержка из документов:
Методы, которые вы не должны переопределять
Сам NSManagedObject настраивает многие функции NSObject, так что управляемые объекты могут быть правильно интегрированы в основные данные инфраструктуры. Основные данные зависят от реализации NSManagedObjects из следующих методов, которые вы, таким образом, абсолютно не должны override: primitiveValueForKey:, setPrimitiveValue: forKey:, isEqual:, хэш, суперкласс, класс, self, isProxy, isKindOfClass:, isMemberOfClass:, соответствует ToProtocol:, отвечаетToSelector:, managedObjectContext, entity, objectID, isInserted, isUpdated, isDeleted и isFault, alloc, allocWithZone:, new, экземплярыRespondToSelector:, instanceMethodForSelector:, methodForSelector:, methodSignatureForSelector:, instanceMethodSignatureForSelector:, или isSubclassOfClass:.
Кроме того, есть и другие методы, которые вы можете переопределить, но вы ДОЛЖНЫ ЗВОНИТЬ супер-реализацию, например, или вызываете: willAccessPrimitiveForKey, didAccessPrimitiveForKey
в accessors и willChangevalueForKey, didChangeValueForKey
в сеттерах....
Ответ 7
Недавно я столкнулся с этой ошибкой, потому что у меня был код в методе will(), который обновил некоторые из свойств управляемого объекта delete после того, как (BOOL) isDeleted уже возвращен true.
Я исправил его:
- (void)willSave {
if (![self isDeleted]) {
//Do stuff...
}
}
Ответ 8
Я столкнулся с очень похожими проблемами с каскадными удалениями, а также с необязательными отношениями родитель-потомок. Это было очень запутанно, потому что я думал, что правило удаления родительских отношений было настроено на каскад. Оказывается, что редактор модели данных в Xcode не сохранил правило удаления. Я бы поставил его в Cascade, перейдем к другому виду и вернусь, и он будет снова установлен на нуль. Мне пришлось перезапустить Xcode и установить правило удаления для каскада. После этого все сработало.
Итак, если кто-то еще сталкивается с этой проблемой, проверьте, что Xcode сохраняет правила удаления, прежде чем вникать в более сложные решения.
Кстати, я использую основные данные на iOS с редактором модели данных Xcode 5.