Wie der Core-Daten ist ManagedObjectModel innen einen Rahmen?
Ich versuche zu migrieren, die einen bestimmten Teil einer meiner apps in einen Rahmen, so dass ich Sie in meiner app selbst und in einer dieser schicken neuen iOS-8-widgets. Dieser Teil ist behandelt, alle meine Daten in Core Data. Es ist ziemlich straight forward, alles über und um auf Sie zuzugreifen. Ich habe gerade Probleme beim Zugriff auf meine momd
Datei vorhanden.
Beim erstellen der NSManagedObjectModel
ich immer noch versuchen, laden Sie die momd
wie dargestellt in apples code-Vorlagen:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyApp" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Leider modelURL
bleibt nil
und damit MyApp
Abstürze beim Zugriff auf die Core-Data-stack mit diesem Fehler:
2014-08-01 22:39:56.885 MyApp[81375:7417914] Cannot create an NSPersistentStoreCoordinator with a nil model
2014-08-01 22:39:56.903 MyApp[81375:7417914] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
So, was ist der richtige Weg, dies zu tun, wenn arbeiten im inneren eines Rahmens mit Core Data?
- Ist die Datei selbst enthalten in dem target, das Sie erstellen? Sieht für mich aus wie die Datei, die Sie verweisen, ist nicht immer Hinzugefügt als Teil der Zielgruppe aufzubauen.
- Meine
MyApp.xcdatamodeld
enthalten ist, in die Mitgliedschaften meiner framework-Ziel, ja. Für diemomd
Datei selbst habe ich keine Ahnung, ob ich das ändern kann überall. Ist das nicht eine erstellt während der Bau - /on-the-fly basierend auf meinenxcdatamodeld
- Datei? - Ich habe noch nie enthalten eine Modell-Datei als Teil eines Rahmens. Wenn ich ein Modell Baue ich das Modell aus dem source-code. Aber ich glaube, Ihr problem ist, dass Sie suchen im main bundle. Haben Sie versucht, das Durchlaufen wird, werden alle bundles, versuchen, laden Sie das Modell aus, bis Sie Erfolg haben?, mit
[NSBundle allBundles]
? - Ja, das habe ich versucht. Das hat nicht funktioniert für mich. Ich iteriert über alle bundles versuchen Sie finden "alle"
MyApp.momd
. Das array, wo ich Sie gespeichert habe alle URLs, die war leer nach der Ausführung durch alle meine Bündel. - Das klingt nicht Recht. Es ist jedoch eine andere option, statt der Verpackung Ihrer eigentlichen Modell-Datei. Sobald Sie festgelegt sind auf Ihr Modell, laden, archivieren Sie es auf einer
NSData
Objekt, dann drehen, die in eine base64-codierte Zeichenfolge. Sie können schreiben, ein einfaches Programm, um es zu tun, oder melden Sie es an die Konsole und Ausschneiden/einfügen der Zeichenfolge. Sie können dann festlegen, dass eine variable zu sein, dass die base64-kodierten string. Wenn Ihr code ausgeführt wird, können Sie dann entschlüsseln Sie die Zeichenfolge inNSData
und dann entpacken Sie es in einNSManagedObjectModel
Instanz. Ihr Modell ist nun Teil Ihrer kompilierten Bibliothek.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein bisschen spät für flohei das Problem, aber hoffentlich hilft jemand anderes, die wanders. Es ist möglich, um diese arbeiten ohne Skript-fu zu kopieren Ressourcen um!
Standardmäßig apples Core-Data-template gibt Ihnen so etwas wie dies:
Würde laden Sie Ihre Core-Data-Ressourcen aus dem main bundle. Das wichtigste hier ist: wenn die Kern-Daten-Modell ist geladen in einen Rahmen, die .momd-Datei in das framework bundle. So anstelle, wir nur dazu:
Sollten Sie aufstehen und laufen.
Credit: https://www.andrewcbancroft.com/2015/08/25/sharing-a-core-data-model-with-a-swift-framework/
Müssen Sie ziehen Sie die xcdatamodeld-Datei und legen Sie es in den Build-Phasen | Kompilieren der Quellen für die Ziele, die die Verwendung des Frameworks. Dann, wenn das Ziel läuft sein [NSBundle mainBundle] wird das Modell enthalten (momd-Datei).
@Ric Santos war fast da. Ich denke, die Sie gerade brauchen, um es zu einem "Mama" - Erweiterung eher als "momd", dann wird es laufen.
Ich kann ein wenig spät mit der Beantwortung dieser, aber hier ist, was mein Problem gelöst:
Mit meinem Rahmen bin ich liefert auch ein bundle mit Ressourcen wie Bilder und andere Sachen. Setzen xcdatamodeld Datei dort nicht alles geben, da diese Datei gebaut mit dem Projekt und als Ergebnis erhalten Sie eine momd Ordner in Ihrer app-bundle (was eigentlich fehlt in unserem Fall)..
Erstellt habe ich ein anderes Ziel, nicht Rahmen, sondern-app, gebaut und kopiert die momd aus seinem app-bundle zu meiner getrennte Bündel in das Projekt (die, die geht mit Rahmen).
Nachdem Sie dies getan haben, die Sie gerade brauchen, um Ihre Ressource-url von Haupt-bundle zum neuen:
Funktionierte gut für mich. Das einzige, was ich bewusst bin, ist die App Store Review die habe ich nicht bekommen.
Wenn Sie also schon eine bessere Lösung gefunden haben, bitte teilen.
BEARBEITEN
Fand eine bessere Lösung. Baust du das Modell selber. Von Core Data Programming Guide:
Durch "/Developer/usr/bin/" Sie bedeuten "/Applications/Xcode.app/Developer/usr/bin/"
Können Sie ein Skript hinzufügen, das in Sie Ziel-Schema und kompilieren Sie diese automatisch vor jedem build (oder nach, glaube nicht, dass es darauf ankommt). Dieser ist im Falle dass, wenn Sie das Modell ändern während der Entwicklung.
Etwas wie dieses:
mkdir -p "${BUILT_PRODUCTS_DIR}/your_model_name.momd"
wird verursacht Fehler beim erstellen der Rahmen. Ich habe, um es zu ändernmomc "${SRCROOT}/RichAPM/Source/DB/RichAPM.xcdatamodeld" "${BUILT_PRODUCTS_DIR}/your_framework_name.framework/your_bundle_name.bundle/model_name.momd"
Auch Baue ich die framework-und bundle-erfolgreich , ich kann immer noch nicht mit dem Modell. Werden Sie bitte geben Sie mir eine hand?Modell Ressource ist nicht mehr zugänglich über die
mainBundle
verwenden, benötigen SiebundleForClass:
etwa so:Ich nehme an, Sie benötigen nur die Daten-Modell.
Wenn dem so ist, finde ich den folgenden konsequent die erfolgreichste Methode für das kopieren über ein Daten-Modell-Datei von einem Projekt zum anderen...
.xcdatamodeld
- Datei befinden, die in das Ziel-Projekt.Nähe Von Xcode.
Mit dem Finder (oder cmd-line);
.xcdatamodeld
Datei..xcdatamodeld
Datei.Verschieben Sie die Kopie der original -
.xcdatamodeld
- Datei für Ihr Ziel-Projekt.Dann...
.xcdatamodeld
- Datei zu Ihrem Projekt..xcdatamodeld
- Datei (falls erforderlich) mit Hilfe des Projekt-Navigator.Funktioniert diese Hilfe?
momd
befindet sich immer noch in dem original-bundle (oder wo auch immer) und ist nicht nur zugänglich von innerhalb des Rahmens. Aber das ist nur eine wilde Vermutung.Wenn Sie versuchen, die wesentlichen Daten in Ihrem Rahmen wie das tun.
in YourFramework
- neue Datei hinzufügen - /Kern-Daten-Modell ...
- erstellen Sie alle-Objekt ....
Beim erstellen eines neuen Projekts, das YourFramework sicher sein, dass core data ist auf
Diese erstellen alle Kessel-Platte im inneren AppDelegate.
in Test-Projekt
- Rahmen hinzufügen
- fügen Sie Rahmen als embedded framework
- LÖSCHEN .xcdatamodeld-Datei
- im AppDelegate :
ändern
- (NSManagedObjectModel *)managedObjectModel
Methode, in :wo
YourFramework bundle id
ist Bundle Identifier von YourFramework (im Allgemeinen /Bundle-Identifier)sowie
Model
ist der name von Ihr .xcdatamodeld-Datei in YourFrameworkDieser funktioniert.
Hoffe, es hilft.