Les relations de données de base provoquent Erreur de sauvegarde après suppression

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

  •  13-09-2019
  •  | 
  •  

Question

Cette question est probablement un long shot. Je ne peux pas comprendre les erreurs que je reçois sur mon projet de données de base quand je sauverai après supprimer une entité.

J'ai deux entités principales que je travaille avec une tenue et un article. Je peux les créer sans problème, mais quand je les supprimer je reçois le journal des erreurs suivantes:

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

Et si je supprime un article que je reçois:

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

Une erreur 1600 est la suivante:

  

NSValidationRelationshipDeniedDeleteError
  Code d'erreur pour indiquer une relation
  la règle de suppression NSDeleteRuleDeny est
  non vide.

     

Disponible sous Mac OS X v10.4 et versions ultérieures.

     

Déclaré en CoreDataErrors.h.

Mais je ne vois pas pour la vie de moi cette relation serait d'empêcher la suppression. Si certains Core Data Assistant peut voir l'erreur de mes moyens, je serais humiliée.

Je ne peux pas marquer cette résolu, parce que je ne réglaient pas vraiment, mais j'ai un travail de travail autour. Dans le .m pour chacun de mes managedObjects j'ai ajouté une méthode qui ressemble à:

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

Vous pouvez voir, d'abord je NiL manuellement les relations, et j'ai l'objet lui-même supprimer. Dans d'autres objets, au lieu de nil-ing, ma méthode de suppression est appelée sur certaines des relations d'objets, pour obtenir une cascade.

Était-ce utile?

La solution 3

Je ne peux pas marquer cette résolu, parce que je ne réglaient pas vraiment, mais j'ai un travail de travail autour. Dans le .m pour chacun de mes managedObjects j'ai ajouté une méthode qui ressemble à:

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

Vous pouvez voir, d'abord je NiL manuellement les relations, et j'ai l'objet lui-même supprimer. Dans d'autres objets, au lieu de-ing nul, ma méthode de suppression est appelée sur certaines des relations d'objets, pour obtenir une cascade.

Je suis toujours intéressé par la « bonne réponse ». Mais c'est la meilleure solution que je l'ai, et il ne permet un certain contrôle à grains fins sur la façon dont mes relations sont supprimés.

Autres conseils

Je viens d'avoir le problème de la suppression échoue, et a atterri sur cette question. Et j'ai compris mon problème et je pensais que je partagerais aussi, et peut-être quelqu'un aura le même problème aussi bien.

L'erreur que je fait est que l'objet (A) Je suis en train de supprimer ont une relation à un autre objet (B) avec NULL règle de suppression. Cependant, l'objet B ont également une relation avec A et il est non-option. Par conséquent, lorsque je supprime A, la relation B de A devient nulle qui est interdit. Quand je change la règle de suppression en cascade et cela a fonctionné.

Avez-vous arrive à mettre en œuvre certains des accesseur à la relation vous-même? J'ai eu un code comme

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

dans une sous-classe de NSManagedObject et avait une erreur sauver. Ce qui est arrivé est que, lorsque cet objet est supprimé de la ManagedObjectContext, le CoreData appelle les accesseurs des « articles » pour faire face à la propagation de suppression. Ce nouveau calcul des articles a eu lieu lors de la propagation de suppression, qui re-surrected les annul dans mon cas des « articles ».

Vérifiez votre fichier xcdatamodel pour une Deny supprimer la règle. Cliquez sur chaque relation jusqu'à ce que vous le trouverez. Vous aurez besoin de changer cette règle ou d'ajuster la façon dont vous supprimez des objets gérés pour anticiper la relation de l'application de la règle.

J'ai eu un problème similaire où il est avéré que le problème était dans le fichier .xib. Lorsque je suis passé sur la case à cocher « supprime les objets sur Supprimer » (sous Fixations-> Set de contenu) du contrôleur de réseau concerné, le problème a disparu.

Je ne sais pas si cela vous aidera dans votre cas, mais j'ai eu beaucoup de poils grisonner sur les problèmes qui se sont avérés être cachés quelque part dans Interface Builder.

Dans mon cas, j'ai innocemment créé méthode personnalisée dans mon sous-classe de NSManagedObject: isDeleted. Je rencontrais étrange sauf exceptions jusqu'à ce que j'enlevé / rebaptisèrent. Après avoir perdu ma santé mentale, je lis des documents encore plus traversantes pleinement cette fois-ci. Il est avéré que je l'une des même remplacée méthodes NSManagedObject il ne faut pas passer outre.

Vérifiez si cet extrait de docs vous aide:

  

Méthodes vous ne devez pas Override

     

NSManagedObject se personnalise de nombreuses fonctionnalités de NSObject afin que   objets gérés peuvent être correctement intégrés dans la base de données   Infrastructure. base de données repose sur la mise en œuvre de NSManagedObject   des méthodes suivantes, vous devez donc absolument pas   remplacer: primitiveValueForKey :, setPrimitiveValue: forKey :,   Le hachage de isEqual, superclasse, classe, auto, isProxy, isKindOfClass :,   isMemberOfClass :, conformsToProtocol :, respondsToSelector :,   managedObjectContext, entité, objectID, isInserted, isUpdated,    isDeleted , et isFault, alloc, allocWithZone de nouveau, instancesRespondToSelector :, instanceMethodForSelector :,   methodForSelector :, methodSignatureForSelector :,   instanceMethodSignatureForSelector :, ou isSubclassOfClass:.

Par ailleurs - il y a d'autres méthodes que vous pouvez passer outre, mais vous devez appeler la mise en œuvre comme super ou appelez: willAccessPrimitiveForKey, didAccessPrimitiveForKey dans accesseurs et willChangevalueForKey, didChangeValueForKey en setters ....

J'ai récemment rencontré cette erreur parce que j'avais code dans le - (void) méthode willSave qui a mis à jour certaines des propriétés de l'objet géré de suppression après -. (BOOL) isDeleted déjà retourné true

Je l'ai fixé par:

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

Je rencontrais un problème très similaire en cascade avec des suppressions, sur non en option relations parent-enfant. Il était très confus parce que je pensais que la relation parent supprimer la règle a été réglé sur cascade. Il se trouve que l'éditeur de modèle de données dans Xcode ne sauvait pas la règle de suppression. Je mettrais à Cascade, aller à un point de vue différent et revenir et il serait mis à nouveau réduire à néant. Je devais redémarrer Xcode et définir la règle de suppression de cascade. Après je l'ai fait tout fonctionnait.

Donc, si quelqu'un d'autre rencontre ce problème vérifiez que Xcode est l'enregistrement de vos règles de suppression avant de plonger dans des solutions plus complexes.

Par la façon dont j'utilise des données de base sur iOS avec Xcode 5 éditeur de modèle de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top