Pergunta

Esta questão é provavelmente um tiro longo. Eu não consigo descobrir os erros que estou recebendo no meu projeto de dados núcleo quando eu salvar depois que eu excluir uma entidade.

Eu tenho duas entidades principais que eu trabalho com, um equipamento, e um artigo. Eu posso criá-los sem nenhum problema, mas quando eu excluí-los eu recebo o log de erro a seguir:

Para o Outfit:

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..)";
})
    )};
}

E se eu excluir um artigo eu recebo:

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..)";
});
}

Um erro 1600 é:

NSValidationRelationshipDeniedDeleteError
O código de erro para denotar alguma relação
com regra de exclusão NSDeleteRuleDeny é
não-vazia.

Disponível em Mac OS X v10.4 e posterior.

declarado em CoreDataErrors.h.

Mas eu não posso ver para a vida de mim que relação seria prevenir a exclusão. Se algum feiticeiro Core Data pode ver o erro dos meus caminhos, gostaria de ser humilhado.

Eu não posso marcar esta resolvido, porque eu realmente não resolvê-lo, mas eu tenho um trabalho trabalho-around. No .m para cada um dos meus managedObjects eu adicionei um método que se parece com:

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

Assim você pode ver, primeiro eu manualmente nil os relacionamentos, e então eu tenho o objeto apagar-se. Em outros objetos, em vez de nil-ing, meu método de exclusão é chamado em algumas das relações objetos, para obter uma cascata.

Foi útil?

Solução 3

Eu não posso marcar esta resolvido, porque eu realmente não resolvê-lo, mas eu tenho um trabalho trabalho-around. No .m para cada um dos meus managedObjects eu adicionei um método que se parece com:

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

Assim você pode ver, primeiro eu manualmente nil os relacionamentos, e então eu tenho o objeto apagar-se. Em outros objetos, em vez de nil-ing, o meu método de exclusão é chamado em algumas das relações objetos, para obter uma cascata.

Ainda estou interessado na resposta "certa". Mas esta é a melhor solução que tenho, e ele permite algum controle de grão fino sobre como meus relacionamentos são excluídos.

Outras dicas

Eu só tinha o problema de exclusão falhar, e pousou sobre esta questão. E eu descobri o meu problema e pensei que eu iria partilhar isso também e talvez alguém vai ter o mesmo problema também.

O erro que eu fiz é que o objeto (A) Eu estou tentando excluir ter um relacionamento para outro objeto (B) com NULL como regra de exclusão. No entanto, objeto B também têm uma relação a A e é não opcional. Portanto, quando eu apagar A, relação de A de B torna-se nulo que não é permitido. Quando eu mudar a regra de exclusão em cascata e funcionou.

Por acaso você implementar algumas das assessor para a relação a si mesmo? Uma vez tive um código como

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

em uma subclasse de NSManagedObject e teve uma gravação de erro. O que aconteceu foi que, quando esse objeto é excluído do ManagedObjectContext, o CoreData chama o acessor "artigos" para lidar com a propagação de exclusão. Esta re-cálculo dos artigos ocorreu durante a propagação de exclusão, que re-surrected os "artigos" anulado no meu caso.

Verifique se o seu arquivo xcdatamodel para uma regra de exclusão Deny. Clique em cada relacionamento até encontrá-lo. Você vai precisar para mudar essa regra ou ajustar a forma como você excluir objetos gerenciados para antecipar a aplicação da regra para o relacionamento.

Eu tive um problema semelhante onde acabou o problema estava no arquivo .xib. Quando eu ligar a caixa de seleção "exclui objetos em Remover" (sob Bindings-> Set conteúdo) da matriz relevante Controller, o problema foi embora.

Não sei se isso vai ajudar no seu caso, mas eu tinha um monte de cabelos ir cinza sobre problemas que acabou por ser escondidos em algum lugar dentro Interface Builder.

No meu caso eu inocentemente criado método personalizado no meu subclasse de NSManagedObject: isDeleted. Eu estava encontrando Economias estranhas exceções até que eu removido / renomeou. Depois de perder a minha sanidade, eu li a documentação novamente mais através de-plenamente este tempo. Descobriu-se que um sobrescrito dos métodos NSManagedObject não se deve substituir.

Verifique se este trecho de documentos ajuda a:

Métodos você não deve substituir

si NSManagedObject personaliza muitas características do NSObject para que objetos gerenciados podem ser devidamente integradas no Núcleo de Dados a infraestrutura. Core Data confia na implementação do NSManagedObject dos métodos a seguir, que você, portanto, absolutamente não deve override: primitiveValueForKey :, setPrimitiveValue: forKey :, isEqual :, de hash, superclasse, classe, auto, isProxy, isKindOfClass :, isMemberOfClass :, conformsToProtocol :, respondsToSelector :, managedObjectContext, entidade, objectID, isInserted, isUpdated, isDeleted , e isFault, alloc, allocWithZone :, novo, instancesRespondToSelector :, instanceMethodForSelector :, methodForSelector :, methodSignatureForSelector :, instanceMethodSignatureForSelector :, ou isSubclassOfClass:.

Além disso - existem outros métodos que você pode substituir, mas você deve chamar super-implementação como ou ligue: willAccessPrimitiveForKey, didAccessPrimitiveForKey em acessores e willChangevalueForKey, didChangeValueForKey em setters ....

Recentemente, encontrou este erro, porque eu tinha código no - método willSave (void) que atualizou algumas das propriedades do objeto gerenciado de exclusão depois -. (BOOL) já isDeleted retornou true

I fixa-lo:

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

Eu estava encontrando um problema muito semelhante com eliminações em cascata, em relacionamentos não opcionais pai-filho. Foi muito confuso, porque eu pensei que a relação pai regra de exclusão foi definida como cascata. Acontece que o editor modelo de dados no Xcode não estava salvando a regra de exclusão. Eu defini-lo para Cascade, ir para uma visão diferente e voltar e seria definido para anular novamente. Eu tive que reiniciar Xcode e definir a regra de exclusão a cascata. Depois que eu fiz isso tudo funcionou.

Então, se alguém encontros esta edição dupla verificação que Xcode é salvar as regras de exclusão antes de investigar soluções mais complicado.

Pela maneira que eu estou usando dados básicos no iOS com o editor de modelo de dados do Xcode 5.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top