Core Data Beziehungen verursachen Fehler speichern, nachdem löschen
-
13-09-2019 - |
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.
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.