web-dev-qa-db-de.com

Duplizieren Sie Dateien im DerivedData-Ordner mithilfe des CoreData-Generators

Ich versuche, aus meinem Datenmodell NSManagedModels zu generieren. Die Generierung funktioniert aber nachdem ich viele Fehler bekommen habe:

fehler: Dateiname "Station + CoreDataProperties.Swift" zweimal verwendet: '/Users/Me/MyApp/Models/CoreData/Station+CoreDataProperties.Swift' und '/ Users/Me/Library/Entwickler/Xcode/DerivedData/MyApp-gwacspwrsnabomertjwq Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/DerivedSources/CoreDataGenerated/Model/Station + CoreDataProperties.Swift ': 0: Anmerkung: Dateinamen werden verwendet, um private Deklarationen mit demselben Namen zu unterscheiden

Ich versuche, sauberen Erstellungsordner und abgeleitetes Datenverzeichnis schwer zu löschen. Ich verwende Xcode 8 BETA. Vielleicht ist es ein Fehler?

42
Ludovic

Ich bekomme dies in Xcode 8.1 Für mich haben die folgenden Schritte das Problem gelöst. Bitte beachten Sie, dass die Bestellung wichtig ist.

1) Erstellen Sie eine Entität im Core Data-Modell.

2) Nehmen Sie im Klassenbereich die Einstellungen wie im folgenden Bild vor.

Modul: Aktueller Produktname

Codegen: Manuell/Keine

3) Generieren Sie Ihre NSManagedObject-Unterklasse.

enter image description here

69

Dieser Beitrag hat mir sehr geholfen, dieses Problem selbst zu lösen. Persönlich betrachte ich dies als einen Xcode-Fehler. Bug oder nicht, das ist eine riesige Henne-Ei-Situation.

Ich bin darauf gestoßen durch:

  1. Erstellt ein neues Projekt mit Core Data
  2. Erzeugte meine NSManagedObject Unterklasse + Erweiterung (während codegen: ClassDefinition)
  3. Ich habe die generierten Klassen versehentlich im Ordner Wrong gespeichert
  4. Ich habe die generierten Dateien gelöscht
  5. Im gewünschten Ordner neu generiert
  6. ???? - Xcode used twice Fehler

Wie andere geschrieben haben, habe ich meinen Build (und clean build folder) Weiter gesäubert, aber das hat das Build-Problem nie behoben.

Ich habe schließlich herausgefunden, ob Sie Ihre NSManagedObject generierten Klassen ursprünglich mit codegen: ClassDefinition Erstellt haben, wie ich es getan habe, ohne zu wissen, dass Sie für die Henne-Ei-Frage eingesperrt sind.

Ich habe dann die automatisch generierten Klassen gelöscht Denken Ich musste neu generieren, also tat ich es. Einmal neu generiert, würde ich den Build-Fehler used twice Erneut erhalten. Ich ging manuell in den ../DerivedSources/CoreDataGenerated/Model/.. Und löschte die Duplikate. Ich habe wieder gedacht, ich hätte nur 1 Kopie (in meinem Projekt), aber ich habe mich geirrt. Wenn ursprünglich codegen: ClassDefinition Eingestellt war, erstellt Xcode weiterhin die Klassen + Erweiterungen auto-generated Und legt sie in dem vergrabenen Ordner ../DerivedSources/CoreDataGenerated/Model/.. Ab. Ich wiederholte dieses Huhn und Ei ein paar Mal, bevor ich anfing.

Ich habe später festgestellt, dass Sie in der Tat codegen: Manual/None Markieren müssen. Um jedoch die Synchronisierung wiederherzustellen, müssen Sie die automatisch generierten Dateien in ../DerivedSources/CoreDataGenerated/Model/.. Und in Ihrem Projekt löschen, falls noch welche vorhanden sind.

Seien Sie vorsichtig bei der Einstellung von codegen: Manual/None, Für mich war es etwas schwierig, weil codegen: Manual/None Nicht stick. Ich musste mehrmals zwischen Entitäten hin und her klicken, um zu überprüfen, ob jede Entität auf codegen: Manual/None Gesetzt war. Dann Dateien automatisch generieren. Zu diesem Zeitpunkt sollte sich Ihre einzige Kopie der automatisch generierten Dateien in Ihrem Projekt befinden und nicht in ../DerivedSources/CoreDataGenerated/Model/...

Zuletzt denke ich, dass dies ein Fehler ist, denn wenn Sie codegen: Manual/None Angeben, erwarte ich nicht, dass Xcode Dateien automatisch generiert, aber es tut dies und fügt sie in Ihr Projekt ein. Noch verwirrender ist es, wenn Sie als Einstellung codegen: ClassDefinition Wählen. Wer zum Teufel weiß, dass Xcode die Dateien in ein vergrabenes Verzeichnis legt, das jedoch für Ihr Projekt verfügbar ist. Mein Rindfleisch ist, dass die automatisch generierten Dateien nicht von der Quelle gesteuert werden. Wenn ich den Computer wechsle, muss ich wissen, ob ich sie auf der neuen Station automatisch generieren kann.

Hoffe das hilft jemand anderem!

Prost!

11
kev

Dies ist in der Tat kein Fehler. Wie @Morrowless vorschlägt, werden sowohl die Klassendefinition als auch die Eigenschaftserweiterung erstellt. Wenn dies nicht gewünscht ist, wählen Sie Manual/None unter Codegen , bevor Sie generieren der Code. Wenn der Code bereits generiert wurde, löschen Sie sie einfach und versuchen Sie es mit Editor->Create NSManagedObject Subclass... erneut aus dem Menü (nach der Einstellung von Manual/None).

Beachten Sie, dass in der folgenden Abbildung der Klassenname "Kontakt" für mein Projekt spezifisch ist. Stattdessen wird der Name Ihrer Entität angezeigt.

enter image description here

8
oyalhi

Wenn Sie CoreData-Unterklassen mit codegen: ClassDefinition Generiert haben, sind Sie grundsätzlich geschraubt. Der einzige Weg, dies zu beheben, ist:

  1. Löschen Sie Ihre CoreData-Unterklassen.
  2. Löschen Sie Ihren abgeleiteten Datenordner.
  3. Bereinigen Sie Ihr Projekt (CMD + K).
  4. Erzeugen Sie neue CoreData-Unterklassen, wählen Sie diesmal Codegen: Manual/None Und Module: Current Product Module
5
100grams

Dies ist kein Fehler. Codegen generiert diese Dateien im DerivedData-Ordner, sodass Sie sie in Ihrem Projekt nicht erneut erstellen müssen, daher der Kompilierungsfehler.

Versionshinweise zu Xcode 8.0:

Xcode generiert automatisch Klassen oder Klassenerweiterungen für die Entitäten und Eigenschaften in einem Core Data-Datenmodell. Die automatische Codegenerierung wird für jede Entität einzeln aktiviert und deaktiviert. Sie wird für alle Entitäten in neuen Modellen aktiviert, die das Xcode 8-Dateiformat verwenden. Diese Funktion ist für alle Datenmodelle verfügbar, die auf das Xcode 8-Format aktualisiert wurden. Mit dem Dateiinspektor des Datenmodells legen Sie fest, ob Xcode Swift oder Objective-C-Code für ein Datenmodell generiert.

Wenn die automatische Codegenerierung für eine Entität aktiviert ist, erstellt Xcode entweder eine Klasse oder eine Klassenerweiterung für die Entität, wie im Inspektor der Entität angegeben: Der angegebene Klassenname wird verwendet, und die Quellen werden in die abgeleiteten Daten des Projekts eingefügt. Sowohl für Swift als auch für Objective-C können diese Klassen direkt aus dem Projektcode verwendet werden. Für Objective-C wird eine zusätzliche Headerdatei für alle generierten Entitäten in Ihrem Modell erstellt. Der Name der Headerdatei entspricht der Namenskonvention „DataModelName + CoreDataModel.h“.

Allerdings, wenn Sie im Datenmodellinspektor im Pulldown-Menü "Codegen" die Option "Kategorie/Erweiterung" ausgewählt haben (weil Sie Ihrem Modell Logik hinzufügen möchten): Codegen generiert fälschlicherweise sowohl die Klassendefinition als auch Eigenschaftserweiterung.

Die Lösung besteht darin, einfach die Eigenschaftserweiterung (ClassName + CoreDataProperties.Swift) zu löschen. Ihr Projekt sollte jetzt kompiliert werden.

3
Morrowless

Nachdem Sie den Anweisungen von oyalhi und Vladimir Shutyuk gefolgt sind (Löschen der NSManagedObject -Dateien, Ändern der Entität codegen in Manual/None) Musste ich Xcode neu starten, damit es wieder indiziert werden konnte, bevor ich die NSManagedObject -Dateien erneut generieren und eine erfolgreiche Kompilierung durchführen konnte.

0
Jacob Davis

Der Vollständigkeit halber..:

Ich bin nur auf den gleichen Fehler gestoßen, aber keine der vorgeschlagenen Lösungen hat funktioniert. Was mich verwunderte, war, dass selbst der Wechsel von der automatisierten Codegenerierung zum manuellen Code für die eine (wie ich dachte) problematische Entität nichts brachte.

Schließlich stellte ich fest, dass ich mehrere Entitäten mit demselben Name hatte, aber alle hatten dasselbe Klassenname. Der Grund dafür war, dass ich eine Entität mehrmals kopiert und eingefügt habe, um mir etwas Arbeit zu ersparen, da sie auch einige Attribute gemeinsam haben.

Es stellte sich heraus, dass XCode die Duplikate umbenennt, indem 1, 2, ... zum Entitätsnamen hinzugefügt werden, aber der Klassenname wie zuvor beibehalten wird. Und da jetzt der Entitätsname und der Klassenname "unabhängig" sind, wird durch das Umbenennen der Entität auch der Klassenname nicht geändert.

Hoffe es hilft jemandem - ich habe auch einen Bugreport dazu eingereicht.

0
Toastor