Подтвердить что ты не робот

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

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

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

Для одежды:

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

4b9b3361

Ответ 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.