web-dev-qa-db-de.com

Xcode-beta 8. Kerndaten können nicht erstellt werden

Ich habe versucht, Kerndaten hinzuzufügen ... und jedes Mal, wenn ich die gleiche Fehlermeldung erhielt: 

error: filename "EntityName +CoreDataClass.Swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.Swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.Swift'

Ich füge Kerndaten mit den folgenden Schritten hinzu:
1.Neue Datei/DataModel; Speichern Sie es im Stammverzeichnis Ihres Projekts
Wählen Sie Model.xcdatamodeld aus und fügen Sie eine Entität hinzu, fügen Sie mehrere Attribute hinzu, speichern Sie editor/erstellen Sie die Unterklasse NSManagedObjectClass.

Als Ergebnis beobachte ich 4 neue Dateien im Navigator: Model.xcdatamodeld, EntityName + CoreDataProperties.Swift, EntityName + CoreDataClass.Swift,COREDATA_DATAMODELNAME+ CoreDataModel.Swift

ihr Inhalt: COREDATA_DATAMODELNAME+ CoreDataModel.Swift: 

import Foundation
import CoreData

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___

EntityName + CoreDataClass.Swift: 

import Foundation
import CoreData


class EntityName: NSManagedObject {

}

EntityName + CoreDataProperties.Swift: 

import Foundation
import CoreData

extension EntityName {

    @nonobjc class func fetchRequest() -> NSFetchRequest< EntityName > {
        return NSFetchRequest< EntityName >(entityName: "EntityName");
    }

    @NSManaged var str: String?

}

Was ich versucht habe:
1. Bereinigen Sie den Build, entfernen Sie DerivedData, löschen Sie den Inhalt von var/ordnern, und starten Sie ihn erneut
2. Löschen Sie die generierten Dateien, die im Navigator angezeigt werden

Alle meine Bemühungen hatten kein Glück.
Was mache ich falsch?

39
spin_eight

Xcode 8 enthält eine automatische NSManagedObject-Klassengenerierung, wenn die Modelldatei das Xcode 8-Dateiformat verwendet. Wenn Sie eigene Unterklassendateien erstellen, erstellen Sie Duplikate. Die zweite Datei in der Fehlermeldung in DerivedSources ist die Datei, die Xcode automatisch erstellt hat.

Wenn die automatisch generierten Dateien das tun, was Sie brauchen, hören Sie einfach auf, Ihre eigenen zu erstellen, und Sie sind in Ordnung.

Wenn Sie stattdessen eigene Unterklassen erstellen möchten, können Sie dies tun

  • Stellen Sie die "Werkzeugversion" für die Modelldatei auf Xcode 7.3 oder eine frühere Version ein, um die gesamte Codegenerierung zu deaktivieren (dies scheint nichts an dem Inhalt der Datei zu ändern) oder
  • Deaktivieren Sie die automatische Erzeugung für jede Entität einzeln, indem Sie die Einstellung "Codegen" auf "Manuell/Keine" für die Entität setzen.
45
Tom Harrington

In XCode 8 gibt es zwei Fehler:

1 - Wenn Sie die Codegen-Dropdown-Liste ändern, wird der neue Wert nicht in Model.xcdatamodel gespeichert. Sie müssen etwas anderes ändern, damit es gespeichert wird. Ändern Sie beispielsweise den Klassennamen. bauen; Ändern Sie den Klassennamen zurück. wieder bauen.

2 - Der generierte Code wird in DerivedData im Ordner Intermediates abgelegt. Dies geschieht jedoch nur, wenn der Ordner noch nicht vorhanden ist. Die Problemumgehung besteht darin, einen Clean und dann einen Build durchzuführen.

52
DavidA

Ich habe tatsächlich das gleiche Problem (mit Swift) und vermute, dass es sich um einen Fehler handelt. Wenn ich es richtig verstanden habe, verwendet das OP die autogenen NSManagedObject-Unterklassen von Xcode und erstellt dann keine weiteren (überflüssigen) Unterklassen, was zu Verwirrung führen kann.

Schritte zum Reproduzieren:

  1. Erstellen Sie ein neues Projekt mit Einzelansicht. Kreuzen Sie "Use Core Data" an

  2. Erstellen Sie eine Entität in der Modellentität, fügen Sie Eigenschaften hinzu, und stellen Sie sicher, dass die Datei .__ ist. gespeichert (manchmal wirft Xcode 8 Beta die Daten ab, wenn nicht explizit gespeichert wurde)

  3. Wählen Sie Editor -> Create NSManagedObject-Unterklasse. Zutreffendes ankreuzen Boxen

Xcode erstellt 3 Dateien:

  1. COREDATA_DATAMODELNAME_ + CoreDataModel.Swift. Diese Datei ist Beschädigt und enthält nicht gültige Einträge nach den Anweisungen von Import Foundation und CoreData. Das Projekt wird nur dann kompiliert, wenn Diese Datei gelöscht wird

    import Foundation
    
    import CoreData
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
    
  2. EntityName + CoreDataClass.Swift

  3. EntityName + CoreDataProperties.Swift

Obwohl der Editor an dieser Stelle keine Fehler kennzeichnet, schlagen die Versuche zum Kompilieren aus den vom OP angegebenen Gründen fehl (nämlich fehlende Dateien mit demselben Namen, jedoch mit dem Präfix '.' Im Ordner DerivedData).

Wenn Sie die NSManagedObject-Unterklassen manuell erstellen, nachdem Sie Ihr Modell erstellt haben, ohne die offensichtlich fehlerbehaftete automatische Generierung von Xcode zu verwenden, gibt es keine Probleme. Ein bisschen mehr Tippen, aber viel zuverlässiger! Sie müssen jedoch von einem "sauberen" Projekt aus starten (d. H. Bevor Sie versucht haben, die Unterklassen automatisch zu generieren). Andernfalls bleibt der Fehler bestehen. Die Ableitung abgeleiteter Daten hilft leider nicht.

***** AKTUALISIERT ***** Es scheint etwas seltsames zu sein und es scheint stilles Code-Generieren zu geben, wie ursprünglich angenommen (entschuldigt), aber dies ist ein anderes Verhalten als erwartet . Außerdem ist dieser Code im Editor nicht sichtbar (was ein wenig sinnlos und verwirrend erscheint). Es wird in einem Unterordner von DerivedData> Build> Intermediates> .Build erstellt.

Ich kann völlig verstehen, warum das OP verwirrt war (genau wie ich!). Was dieses "Feature" wert ist, ist zweifellos ein Versuch, hilfreich zu sein, aber es ist etwas verwirrend, wenn Sie an vorheriges Verhalten gewöhnt sind und Ihnen eine Option zur Erzeugung angeboten wird ein sichtbares und bearbeitbares Duplikat aus dem Hauptmenü.

Wählen Sie also im Codegen-Fenster die Option "Manual/None" (siehe unten), und Sie können entweder die Auto-Gen-Option in der Menüleiste verwenden (nachdem Sie den "Junk" gelöscht haben) oder Ihren eigenen Code schreiben.

 New XCode 8 codegen option

12
rustproofFish

Folge diesen Schritten,

  1. Deaktivieren Sie die automatische Erzeugung für jede Entität einzeln, indem Sie die Einstellung "Codegen" auf "Manuell/Keine" für die Entität setzen.

  2. Ändern Sie den Entitätsnamen in etwas anderes, damit er gespeichert wird. Zum Beispiel Den Klassennamen ändern; bauen; Ändern Sie den Klassennamen zurück. wieder bauen

5
Baig

Ich habe diesen Fehler bekommen,

Ändern Sie einfach die Werkzeugversion in Xcode 7.3 in Ihre Datei

und es funktioniert gut!

2

Nachdem ich eine Handvoll geposteter Antworten ausprobiert hatte, funktionierte mein Rechner für mich. 

0
AlexMath

Tom Harrington Die Antwort ist richtig. Es gibt jedoch eine Möglichkeit, eigene Funktionen und/oder Variablen hinzuzufügen, ohne eine der beiden genannten Optionen auszuführen.

Einfach eine Erweiterung der Klasse erstellen. (Stellen Sie sicher, dass Sie der Swift-Datei einen anderen Namen geben als die automatisch generierten NSManagesObject-Dateien.)

Zum Beispiel. Wenn Sie über eine Entität mit dem Namen MyEntity verfügen, können Sie eine Swift-Datei mit dem Namen MyEntityExtension.Swift hinzufügen, die in etwa wie folgt aussehen könnte:

import Foundation
import CoreData
import UIKit


extension MyEntity {

    var color: UIColor {
        get {
            return self.colorValue as! UIColor
        }
        set {
            if newValue.isMember(of: UIColor.self) {
                self.colorValue = newValue
            }
        }
    }

}
0
guido

Für alle, die Schwierigkeiten haben, Autogen zur Arbeit zu bringen:

Ich musste "com.Apple.syncservices.Syncable" in den Benutzerinformationseinstellungen für die Entität auf "NO" setzen.

Vielleicht hilft das aus.

0
Rion

Löschen Sie Compile-File-Core-Daten im Tab "Buildphasen" im Bereich "Compile-Quelle" gedrückt - 

0
Sasha Tsvigun