Frage

Ist es möglich, Beziehungen zwischen Entitäten zu modellieren, die in getrennten NSManagedObjectModels definiert sind, wenn die Einheiten immer innerhalb eines NSManagedObjectModel verwendet werden, die durch die Zusammenlegung der entsprechenden Modelle erstellt wird?

Angenommen, Modell 1 eine Einheit mit Foo Beziehung definiert (one-to-one) toBar und Modell 2 definiert eine Entität Bar mit einer Beziehung (one-to-one) toFoo. Ich werde einen Coredata Stack -[NSManagedObjectModel mergedModelFromModels], Zusammenführen Modell 1 und Modell bauen 2. Gibt es eine Möglichkeit, diese Beziehungen zu definieren, entweder in den Daten-Modellierer oder programmatisch, so dass sie sich verhalten, als ob sie Beziehungen in-Modell waren?

War es hilfreich?

Lösung

Weder Modell 1 noch Modell 2 wird zur Laufzeit geladen werden können, es sei denn, sie sind wohlgeformt - das heißt, es sei denn, die toBar und toFoo Beziehungen Ziele haben. Darüber hinaus haben, wenn Modell 1 und Modell 2-gleichnamigen Modelle, werden Sie nicht in der Lage sein, aus ihnen ein fusionierten Modell zu schaffen; sie werden nicht verschmolzen werden, werden sie zusammenstoßen, was ein Fehler ist.

Sie können jedoch die NSManagedObjectModel API verwenden, manuell jedes Modell zu laden und ein neues Modell von Hand erstellen, die Elemente aus beiden enthält. Die NSEntityDescription und NSPropertyDescription Klassen (und ihre Unterklassen) tun das NSCopying Protokoll implementieren, damit in den meisten Fällen sollen Sie nur in der Lage sein, Objekte von jedem Komponenten-Modell, um Ihr allgemeines Modell zu kopieren über.

Darüber hinaus unterstützen die NS*Description Klassen alle ein userInfo Wörterbuch, das Sie Datenmodellierungswerkzeug bearbeiten können in Xcode, die Sie Dinge wie Tag zu tun, um das Ziel einer Beziehung als Stand-in nutzen können. Zum Beispiel in Modell 1 Sie könnten eine Bar Entität mit einem userInfo Schlüssel MyRealEntity haben und für das überprüfen, wenn Ihr fusionierten Modell zu schaffen, als ein Signal stattdessen die reale Einheit zu verwenden.

Sie wollen auch Stand-in inverser Beziehung zu Ihrem Stand-in Einheiten setzen; Diese werden mit echten Umkehrungen nach Zusammenlegung ersetzt werden. Sie müssen Ihren Stand-in Entitäten in allen Modellen nicht vollständig repliziert werden, obwohl; Sie müssen nur die inversen Beziehungen in Ihrem realen Modell in Einheit in einem Ständer verwendet wird.

Wenn also Ihre echten Foo ein name Attribut hat, und Ihre Bar hat ein kind Attribut, Ihr Stand-in Foo und Bar wird diejenigen, die nicht braucht, nur steht-in toBar und toFoo Beziehungen.

Hier ist etwas Code zeigen, was ich spreche:

- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models {
    NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease];

    // General strategy:  For each model, copy its non-placeholder entities
    // and add them to the merged model. Placeholder entities are identified
    // by a MyRealEntity key in their userInfo (which names their real entity,
    // though their mere existence is sufficient for the merging).

    NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0];

    for (NSManagedObjectModel *model in models) {
        for (NSEntityDescription *entity in [model entities]) {
            if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) {
                NSEntityDescription *newEntity = [entity copy];
                [mergedModelEntities addObject:newEntity];
                [newEntity release];
            } else {
                // Ignore placeholder.
            }
        }
    }

    [mergedModel setEntities:mergedModelEntities];

    return mergedModel;
}

Das funktioniert, weil das Kopieren von NS*Description Objekten in Core Data by-Namen ist und nicht durch-Wert in Bezug auf eine Zieleinheit und inverse Beziehung (und zu einem Sub-Entitäten des Unternehmens als auch). Während also ein Modell wandelbar ist - das heißt, bevor es als Modell für eine NSPersistentStoreCoordinator Set -. Sie Tricks wie diese verwenden können Ihr Modell in mehrere Modelle zu brechen

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