Frage

Diese Frage ist wahrscheinlich eine lange gedreht. Ich kann nicht die Fehler herauszufinden, ich bin auf dem Kerndaten Projekt bekommen, wenn ich speichern, nachdem ich eine Entität löschen.

Ich habe zwei Haupteinheiten, die ich mit, ein Outfit arbeiten, und einen Artikel. Ich kann sich ohne Probleme schaffen, aber wenn ich sie, dass ich das Folgefehlerprotokoll erhalten löschen:

Für das 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..)";
})
    )};
}

Und wenn ich einen Artikel löschen, erhalte ich:

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

A 1600 Fehler sind:

  

NSValidationRelationshipDeniedDeleteError
  Fehlercode zu bezeichnen, eine Beziehung
  NSDeleteRuleDeny mit Löschregel ist
  nicht leer ist.

     

Erhältlich in Mac OS X 10.4 und höher.

     

erklärt in CoreDataErrors.h.

Aber ich kann für das Leben von mir nicht sehen, welche Beziehung der Lösch zu verhindern wäre. Wenn einige Core Data Assistent den Fehler meiner Wege sehen kann, würde ich gedemütigt werden.

Ich kann nicht markieren diese gelöst, weil ich es nicht wirklich gelöst haben, aber ich habe eine Arbeits Behelfslösung. Im .m für jedes meiner managedObjects habe ich eine Methode, die wie folgt aussieht:

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

So Sie sehen können, ersten nil I manuell die Beziehungen, und dann habe ich das Objekt selbst löschen. In anderen Objekten, statt nil-ing, meine Löschmethode auf einige der Objekte, Beziehungen genannt, eine Kaskade zu erhalten.

War es hilfreich?

Lösung 3

Ich kann nicht markieren diese gelöst, weil ich es nicht wirklich gelöst haben, aber ich habe eine Arbeits Behelfslösung. Im .m für jedes meiner Managed habe ich eine Methode, die wie folgt aussieht:

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

So Sie sehen können, ersten nil I manuell die Beziehungen, und dann habe ich das Objekt selbst löschen. In anderen Objekten, statt Null-ing, ist meine Löschmethode auf einige der Objekte, Beziehungen genannt, eine Kaskade zu erhalten.

Ich bin immer noch daran interessiert, die „richtige“ Antwort. Aber dies ist die beste Lösung, die ich habe, und es erlaubt für einig feinkörnige Kontrolle darüber, wie meine Beziehungen gelöscht werden.

Andere Tipps

Ich hatte nur das Problem des Lösch scheitern, und zu dieser Frage gelandet. Und ich habe mein Problem herausgefunden und dachte, dass ich das auch teilen würde und vielleicht jemand das gleiche Problem auch haben.

Der Fehler, den ich gemacht ist, dass das Objekt (A) ich eine Beziehung zu löschen bin versucht hat auf ein anderes Objekt (B) mit NULL als Löschregel. Allerdings Objekt B auch eine Beziehung zu A hat, und es ist nicht optional. Deshalb, wenn ich A löschen, wird B die Beziehung von A null, was nicht erlaubt ist. Wenn ich die Löschregel ändern kaskadieren und es funktioniert.

Sie zufällig einige der Accessor die Beziehung selbst implementieren? Ich hatte einmal einen Code wie

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

in einer Unterklasse von NSManagedObject und hatte einen Fehler speichern. Was geschah, war, dass, wenn das Objekt aus dem ManagedObjectContext gelöscht wird, die Coredata die Accessor „Artikel“ rufen die Lösch Ausbreitung zu beschäftigen. Diese erneute Berechnung von Artikeln aufgetreten während der Löschausbreitung, die die weggefallenen „Artikel“ in meinem Fall wieder surrected.

Überprüfen Sie Ihre xcdatamodel-Datei für eine Deny löschen Regel. Klicken Sie auf jeder Beziehung, bis Sie es finden. Sie werden diese Regel müssen sich ändern oder anpassen, wie Sie verwaltete Objekte löschen die Regel Anwendung auf das Verhältnis zu antizipieren.

Ich hatte ein ähnliches Problem, wo es das Problem in der .xib Datei war stellte sich heraus. Wenn ich auf dem Kontrollkästchen eingeschaltet für „Löscht Objekte auf Remove“ (unter Bindings-> Content Set) des jeweiligen Array-Controller, das Problem ging weg.

Sie weiß nicht, ob dies in Ihrem Fall helfen, aber ich habe eine Menge Haare geht grau über Probleme hat, die aus weg innerhalb Interface Builder irgendwo versteckt gedreht werden.

In meinem Fall habe ich unschuldig benutzerdefinierte Methode in meiner Unterklasse von NSManagedObject erstellt: isDeleted. Ich war zu begegnen seltsame Ausnahmen speichern, bis ich entfernt / umbenannt. Nach meinem Verstand zu verlieren, habe ich gelesen, Dokumentation wieder mehr Durch voll diesmal. Es stellte sich heraus, dass ich eine der NSManagedObject Methoden außer Kraft gesetzt Man darf nicht außer Kraft setzen.

Überprüfen Sie, ob dieser Auszug aus docs hilft Ihnen:

  

Methoden Sie dürfen nicht außer Kraft setzen

     

NSManagedObject selbst individualisiert viele Eigenschaften von NSObject, so dass   verwaltete Objekte richtig integriert in die Kerndaten werden können   Infrastruktur. Core Data setzt auf NSManagedObject Implementierung   die folgenden Methoden, die Sie müssen daher absolut nicht   außer Kraft setzen: primitiveValueForKey :, setPrimitiveValue: forKey :,   isEqual :, Hash, übergeordnete Klasse, Klasse, selbst, isProxy, isKindOfClass :,   isMemberOfClass :, conformsToProtocol :, respondsToSelector :,   managedObjectContext, Einheit, objectID, isInserted, isUpdated,    isDeleted , und isFault, alloc, allocWithZone :, neu, instancesRespondToSelector :, instanceMethodForSelector :,   methodForSelector :, methodSignatureForSelector :,   instanceMethodSignatureForSelector :, oder isSubclassOfClass:.

Außerdem - es andere Methoden sind, können Sie außer Kraft setzen aber Sie müssen wie super Implementierung anrufen oder anrufen: willAccessPrimitiveForKey, didAccessPrimitiveForKey in Zugriffs- und willChangevalueForKey, didChangeValueForKey in Etter ....

ich diesen Fehler vor kurzem festgestellt, weil ich Code in dem hatte - (void) willSave Verfahren, die nach dem einige der Eigenschaften des Lösch verwalteten Objekts aktualisiert. - (BOOL) isDeleted bereits zurück true

Ich reparierte sie durch:

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

Ich war ein sehr ähnliches Problem mit Cascading Löschungen, auf nicht optional Eltern-Kind-Beziehungen zu stoßen. Es war sehr verwirrend, weil ich die übergeordnete Beziehung Regel löschen gedacht wurde Kaskade gesetzt. Es stellt sich heraus, dass das Datenmodell-Editor in Xcode wurde nicht die Löschregel zu speichern. Ich würde es Cascade, gehen auf eine andere Ansicht und kommen zurück, und es würde eingestellt werden wieder zunichte zu machen. Ich hatte Xcode neu zu starten, und stellen Sie die Löschregel auf Kaskade. Nachdem ich dies alles tat gearbeitet.

Also, wenn jemand anderes trifft dieses Problem zu überprüfen, dass Xcode Ihre Löschregeln speichert, bevor sie in kompliziertere Lösungen einzutauchen.

Durch die Art, wie ich bin mit Kerndaten auf iOS mit Xcode 5 der Datenmodell-Editor.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top