web-dev-qa-db-fra.com

Xcode-beta 8. Impossible de créer des données de base

J'ai essayé d'ajouter des données de base. Et chaque fois j'ai la même erreur:

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'

J'ajoute des données de base en procédant comme suit:
1.Nouveau fichier/Modèle de données; enregistrez-le dans le répertoire racine de mon projet
sélectionnez Model.xcdatamodeld et ajoutez une entité, ajoutez plusieurs attributs, enregistrez, créez/créez une sous-classe NSManagedObjectClass.

En conséquence, j'observe 4 nouveaux fichiers dans le navigateur: Model.xcdatamodeld, EntityName + CoreDataProperties.Swift, EntityName + CoreDataClass.Swift,COREDATA_DATAMODELNAME+ CoreDataModel.Swift

leur contenu: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?

}

Ce que j'ai essayé
1. Nettoyer la construction, supprimer DerivedData, supprimer le contenu de var/folder, redémarrer
2. Supprimer les fichiers générés, affichés dans le navigateur

Tous mes efforts ont été malchanceux.
Qu'est ce que je fais mal?

39
spin_eight

Xcode 8 inclut la génération automatique de classes NSManagedObject lorsque le fichier de modèle utilise le format de fichier Xcode 8. Si vous créez vos propres fichiers de sous-classe, vous créez des doublons. Le deuxième fichier du message d'erreur, dans DerivedSources, est celui que Xcode a créé automatiquement.

Si les fichiers générés automatiquement font ce dont vous avez besoin, arrêtez de créer les vôtres et tout ira bien.

Si vous souhaitez créer vos propres sous-classes, vous pouvez soit

  • Définissez la "version des outils" du fichier de modèle sur Xcode 7.3 ou une version antérieure pour désactiver toute génération de code (cela ne semble rien changer de significatif pour le contenu réel du fichier), ou
  • Désactivez la génération automatique pour chaque entité individuellement en définissant le paramètre "Codegen" sur "Manuel/Aucun" pour l'entité.
45
Tom Harrington

Il y a deux bogues dans XCode 8 ici:

1 - Si vous modifiez la liste déroulante Codegen, sa nouvelle valeur n'est pas enregistrée dans Model.xcdatamodel. Vous devez changer quelque chose d'autre pour le sauver. Par exemple, changez le nom de la classe. construire; changer le nom de la classe en arrière; construire à nouveau.

2 - Le code généré est placé dans DerivedData dans le dossier Intermediates, mais cela ne se produit que si le dossier n'existe pas déjà. La solution consiste à effectuer un nettoyage, puis une construction.

52
DavidA

En fait, j'ai le même problème (avec Swift) et je suppose que c'est un bug. Si je comprends bien, l'OP utilise les sous-classes NSManagedObject autogen de Xcode et ne crée pas ensuite de sous-classes supplémentaires (superflues), ce qui semble être une source de confusion.

Étapes à suivre pour reproduire:

  1. Créez un nouveau projet, application à vue unique. Cochez "Utiliser les données de base"

  2. Créez une entité dans l'entité de modèle, ajoutez des propriétés, assurez-vous que le fichier est sauvegardé (parfois Xcode 8 beta envoie les données s’il n’est pas explicitement enregistré enregistré)

  3. Sélectionnez Éditeur -> Sous-classe NSManagedObject créée. Cochez la case appropriée des boites

Xcode crée 3 fichiers:

  1. COREDATA_DATAMODELNAME_ + CoreDataModel.Swift. Ce fichier est Corrompu et contient des entrées non valides à la suite des instructions de Import Foundation et CoreData - le projet ne sera pas compilé sauf si Ce fichier est supprimé.

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

  3. EntityName + CoreDataProperties.Swift

Bien que l'éditeur ne signale aucune erreur à ce stade, les tentatives de compilation échouent pour les raisons indiquées par l'OP (à savoir, fichiers manquants portant le même nom mais avec un préfixe "." Dans le dossier DerivedData).

Si vous créez manuellement les sous-classes NSManagedObject après avoir créé votre modèle sans utiliser la génération automatique apparemment bogue de Xcode, aucun problème ne survient. Un peu plus de frappe mais beaucoup plus fiable! Cependant, vous devrez commencer par un projet "propre" (c'est-à-dire avant de tenter de générer automatiquement les sous-classes), sinon l'erreur persiste. Le nettoyage des données dérivées n’aidera malheureusement pas.

***** MISE À JOUR ***** Il semble y avoir quelque chose d'assez étrange et il semble y avoir une génération de code silencieuse telle que suggérée à l'origine (excuses), mais il s'agit d'un comportement très différent de celui auquel on pourrait s'attendre . De plus, ce code n'est pas visible dans l'éditeur (ce qui semble un peu inutile et déroutant). Il est créé dans un sous-dossier DerivedData> Build> Intermediates> .Build.

Je comprends tout à fait pourquoi le PO était confus (comme ce fut le cas pour moi!). Ce qui en vaut la peine, c’est sans aucun doute une tentative d’aide, mais un peu déroutant si vous êtes habitué à un comportement antérieur et qu’on vous propose une option pour générer une copie visible et modifiable dans le menu principal.

Sélectionnez donc «Manuel/Aucun» dans la fenêtre de Codegen (voir ci-dessous), puis vous pourrez soit utiliser l’option de génération automatique de la barre de menus (après avoir supprimé le «courrier indésirable»), soit écrire votre propre code.

 New XCode 8 codegen option

12
rustproofFish

Suivez ces étapes,

  1. Désactivez la génération automatique pour chaque entité individuellement en définissant Le paramètre "Codegen" sur "Manuel/Aucun" pour l'entité.

  2. Remplacez le nom de l’entité par un autre élément à sauvegarder. Par exemple, changez le nom de la classe. construire; changer le nom de la classe en arrière; construire à nouveau.

5
Baig

J'ai eu cette erreur,

il suffit de changer la version de l'outil en Xcode 7.3 dans votre fichier .xcdatamodeld

et ça marche bien!

2
Alexandre Giguere

Après avoir essayé quelques réponses postées, le redémarrage de ma machine a fonctionné pour moi. 

0
AlexMath

Tom Harrington La réponse est correcte. Cependant, il existe un moyen d'ajouter vos propres fonctions et/ou vars sans utiliser aucune des deux options mentionnées.

Juste créez une extension de la classe . (Assurez-vous de nommer le fichier Swift avec un nom différent de celui des fichiers NSManagesObject générés automatiquement.)

Par exemple. Si vous avez une entité appelée MyEntity, vous pouvez ajouter un fichier Swift appelé MyEntityExtension.Swift qui pourrait ressembler à ceci:

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

Pour tous ceux qui ont du mal à faire fonctionner autogen:

Je devais définir "com.Apple.syncservices.Syncable" sur "NON" dans les paramètres d'informations utilisateur pour l'entité.

Peut-être que ça aide.

0
Rion

Supprimez les données de base du fichier de compilation dans la section "phases de construction" de l'onglet "source de compilation" appuyées - 

0
Sasha Tsvigun