Основные отношения данных вызывают ошибку сохранения после удаления

StackOverflow https://stackoverflow.com/questions/1463382

  •  13-09-2019
  •  | 
  •  

Вопрос

Этот вопрос, вероятно, является отдаленным.Я не могу определить ошибки, которые возникают в моем проекте основных данных при сохранении после удаления объекта.

У меня есть две основные сущности, с которыми я работаю: наряд и статья.Я могу создать их без проблем, но когда я их удаляю, я получаю следующий журнал ошибок:

Для наряда:

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, мой метод удаления вызывается для некоторых отношений объектов, чтобы получить каскад.

Это было полезно?

Решение 3

Я не могу отметить это как решенное, потому что на самом деле я его не решил, но у меня есть рабочий обходной путь.В .m для каждого из моих управляемых объектов я добавил метод, который выглядит следующим образом:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

Итак, как вы можете видеть, сначала я вручную обнуляю связи, а затем удаляю сам объект.В других объектах вместо обнуления мой метод удаления вызывается для некоторых отношений объектов, чтобы получить каскад.

Меня все еще интересует «правильный» ответ.Но это лучшее решение, которое у меня есть, и оно позволяет в некоторой степени контролировать удаление моих отношений.

Другие советы

У меня только что возникла проблема с ошибкой удаления, и я остановился на этом вопросе.И я понял свою проблему и подумал, что тоже поделюсь ею, и, возможно, у кого-то тоже будет такая же проблема.

Ошибка, которую я совершил, заключается в том, что объект (A), который я пытаюсь удалить, связан с другим объектом (B) с NULL в качестве правила удаления.Однако объект B также имеет отношение к A, и это необязательно.Следовательно, когда я удаляю A, отношение B к A становится нулевым, что недопустимо.Когда я изменил правило удаления на каскадное, и оно сработало.

Вы случайно не реализовали некоторые средства доступа к отношениям?Когда-то у меня был код типа

-(NSSet*)articles
{
       re-calculates properties....
       return [self primitiveValueForKey:@"articles"];
}

в подклассе NSManagedObject и произошла ошибка сохранения.Произошло следующее: когда этот объект удаляется из ManagedObjectContext, CoreData вызывает метод доступа «articles», чтобы справиться с распространением удаления.Этот перерасчет статей произошел во время распространения удаления, которое в моем случае воскресило обнуленные «статьи».

Проверьте свои xcdatamodel файл для Deny удалить правило.Нажимайте на каждое отношение, пока не найдете его.Вам потребуется изменить это правило или настроить способ удаления управляемых объектов, чтобы предвидеть применение правила к отношениям.

У меня была аналогичная проблема: выяснилось, что проблема была в файле .xib.Когда я установил флажок «Удаляет объекты при удалении» (в разделе «Привязки->Набор содержимого») соответствующего контроллера массива, проблема исчезла.

Не знаю, поможет ли это в вашем случае, но у меня много волос поседели из-за проблем, которые оказались спрятаны где-то внутри Interface Builder.

В моем случае я невинно создал собственный метод в своем подклассе NSManagedObject:удален.Я сталкивался со странными исключениями при сохранении, пока не удалил/переименовал его.Потеряв рассудок, я снова прочитал документацию, на этот раз более подробно.Оказалось, что я переопределил один из методов NSManagedObject, который НЕ ДОЛЖЕН ПЕРЕОпределять.

Проверьте, поможет ли вам этот отрывок из документации:

Методы, которые нельзя переопределять

Сам NSmanagedObject настраивает множество функций NSOBject, так что управляемые объекты могут быть должным образом интегрированы в основную инфраструктуру данных. Основные данные опираются на реализацию NSmanagedObject следующих методов, которые вы, следовательно, абсолютно не должны переопределять: Примитива ValueForkey:, SetPrimitiationValue: ForKey:, ISEQUAL:, HASH, SuperClass, Class, Self, Isproxy, Iskindofclass:, IsmemberOfclass:, ConformStoProtocol:, ответ Ststoselector :,, удалено, и isfault, alloc, allocwithzone:, новый, экземпляры, эндоунджестсосектор:, instancemethodforselector:, MethodForselector:, MethodGinatureForselector:, instanceMethodSignatureForselector:, или issubClassOfClass :.

Кроме того, есть и другие методы, которые вы можете переопределить, но вы ДОЛЖНЫ ВЫЗВАТЬ суперреализацию, например или вызвать: willAccessPrimitiveForKey, didAccessPrimitiveForKey в аксессуарах и willChangevalueForKey, didChangeValueForKey в сеттерах....

Недавно я столкнулся с этой ошибкой, поскольку у меня был код в методе - (void)willSave, который обновлял некоторые свойства управляемого объекта удаления после того, как - (BOOL)isDeleted уже возвращал значение true.

Я исправил это:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}

Я столкнулся с очень похожей проблемой с каскадными удалениями в необязательных отношениях родитель-потомок.Это меня очень сбивало с толку, потому что я думал, что правило удаления родительских отношений настроено на каскадирование.Оказывается, редактор модели данных в Xcode не сохранял правило удаления.Я бы установил для него значение «Каскад», перешел в другое представление и вернулся, и он снова был бы обнулен.Мне пришлось перезапустить Xcode и установить каскадное правило удаления.После того, как я это сделал, все заработало.

Поэтому, если кто-то еще столкнется с этой проблемой, дважды проверьте, что Xcode сохраняет ваши правила удаления, прежде чем углубляться в более сложные решения.

Кстати, я использую основные данные на iOS с редактором модели данных Xcode 5.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top