2010-12-01 3 views
1

Ich analysiere Daten auf einem Hintergrund-Thread, Einfügen neuer Entitäten und Einrichten von Beziehungen mit anderen vorhandenen Entitäten.Core Data: Illegaler Versuch, Beziehung + (null) Kontext zu erstellen

Manchmal bekomme ich den Fehler: 'Versuch, Beziehung zwischen Objekten in verschiedenen Kontexten herzustellen'.

Nachdem ich mehr darüber gelesen habe, erstelle ich jetzt einen neuen ManagedObjectContect in meinem Hintergrund-Thread und benutze ihn, um die neuen Entitäten einzufügen und die Beziehungen einzurichten. Ich bin vorsichtig, diesen neuen ManagedObjectContext nur in meinem Hintergrundthread zu verwenden. Wenn ich eine vorhandene Entität finden muss, um eine Beziehung zwischen einem vorhandenen Objekt und einem dieser neuen Objekte einzurichten, rufe ich [moc objectWithId: id] auf, um das existierende Objekt mit meinem neuen moc zu holen. Ich bekomme jedoch immer noch den Fehler.

Frustriert begann ich, Dinge auszudrucken. Ich habe festgestellt, dass, wenn ich die Eigenschaft managedObjectContext für jedes NSManagedObject ausdrucke, kurz vor dem Einrichten der Beziehung manchmal '(null)' ausgedruckt wird. Dies scheint zu sein, wenn das Problem auftritt.

Kann mir jemand sagen, was ich falsch mache? Warum habe ich manchmal (Null) Mocs auf meinen Objekten?

Danke für jede Hilfe, die Sie geben können!

+0

Es ist nicht möglich, dieses Problem zu diagnostizieren, ohne dass Backtraces und Code eingeschlossen sind. –

Antwort

0

Wir müssen etwas von Ihrem Code sehen. Mein erster Gedanke wäre zu prüfen, ob Sie über seine Eigenschaft oder direkt auf den managedObjectContext zugreifen?

Wenn Sie über die Eigenschaft darauf zugreifen, wird sichergestellt, dass der Kontext immer verfügbar ist (d. H. Nicht null), wenn Sie neue verwaltete Objekte erstellen, vorausgesetzt Sie verwenden die von Apple bereitgestellten Schablonenkerndatenmethoden.

+0

Rog, um die Eigenschaft managedObjectContext zu überprüfen, protokolliere ich einfach [entity managedObjectContext]. Dies ist, was manchmal '(Null)' zurückgibt. – toofah

+0

Ohne Ihren Code zu sehen, wird es unmöglich sein, Ihnen zu helfen, tut mir leid! – Rog

0

Das NSmanagedObject hat eine Methode namens isInserted, die bestätigt, ob ein Objekt in einen managedObjectContext eingefügt wurde, um diesen Wert zu überprüfen, wenn es nicht die Einfügemethode für NSManagedObjectContext verwendet, um es einzufügen.

+0

Jonathan, die neuen Entitäten werden in den Moc eingefügt. Die vorhandenen Entitäten, auf die ich zugreifen möchte, befinden sich bereits im persistenten Speicher. – toofah

+0

Möglicherweise müssen Sie die beiden Objektkontexte zusammenführen. Untersuchen Sie die mergeChangesFromContextDidSaveNotification: of NSManagedObjectContext. Sehen Sie sich auch das Beispiel für Kerndatenbücher und das Kerndatenbuch von marcus zara an. Ich fand die letzte eine lohnende Investition, um mit dieser Situation umzugehen. – Jonathan

1

Die wahrscheinlichste Erklärung ist, dass Sie versuchen, mit Objekten zu verknüpfen, die in einem Kontext erstellt wurden und nicht mit dem anderen Kontext zusammengeführt wurden. Keine Änderungen in einem Kontext werden in einem anderen angezeigt, bis der Kontext zusammengeführt wurde. Das sagt Ihnen Ihre Fehlermeldung.

Das Null-Objekt wird höchstwahrscheinlich durch temporäre Objekt-IDs verursacht. Eine Objekt-ID wird erst behoben, wenn das Objekt im persistenten Speicher gespeichert wurde. Bis dahin hat es eine temporäre ID, die sich beim Speichern ändert.