40 votes

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 eu 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 les données de base en suivant les étapes suivantes :
1. nouveau fichier/ DataModel ; le sauvegarder dans le répertoire racine de mon projet.
sélectionner Model.xcdatamodeld et ajouter une entité, ajouter plusieurs attributs, sauvegarder, éditeur/créer la sous-classe NSManagedObjectClass.

En conséquence, j'observe 4 nouveaux fichiers dans le navigateur : Model.xcdatamodeld, EntityName+CoreDataProperties.swift, EntityName +CoreDataClass.swift, _COREDATA_DATAMODELNAME_ (NOM DU MODÈLE DE DONNÉES) +CoreDataModel.swift

leur contenu : _COREDATA_DATAMODELNAME_ (NOM DU MODÈLE DE DONNÉES) +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 les DerivedData, supprimer le contenu des var/dossiers, redémarrer.
2. Supprimer les fichiers générés, affichés dans le navigateur

Tous mes efforts n'ont pas eu de chance.
Qu'est-ce que je fais de mal ?

53voto

David Atkinson Points 686

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 qu'elle soit enregistrée. Par exemple, changez le nom de la classe ; construisez ; changez à nouveau le nom de la classe ; construisez à 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 de contournement est de faire un nettoyage puis une construction.

6 votes

Ceci doit être marqué comme la bonne réponse. Changer le nom, construire, le changer à nouveau, reconstruire a réparé mes erreurs.

4 votes

Vous êtes un sauveur de vies ! Qui aurait soupçonné que les paramètres de la liste déroulante Codegen ne sont pas sauvegardés ?

0 votes

Tu viens de me sauver ! Cette astuce qui consiste à changer quelque chose dans les classes du modèle pour sauvegarder les paramètres de la génération de code - tout simplement génial ! Merci !

45voto

Tom Harrington Points 17226

Xcode 8 comprend une fonction automatique NSManagedObject génération de classe lorsque le fichier 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 dans le message d'erreur, dans DerivedSources est celui que Xcode a créé automatiquement.

Si les fichiers générés automatiquement répondent à vos besoins, cessez de créer les vôtres et tout ira bien.

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

  • Définissez la "version des outils" du fichier modèle comme étant Xcode 7.3 ou antérieure pour désactiver toute génération de code (cela ne semble pas changer quoi que ce soit de significatif sur le contenu réel du fichier), ou
  • Désactiver la génération automatique pour chaque entité individuellement en réglant le paramètre "Codegen" sur "Manual/None" pour l'entité.

0 votes

Bonjour ! Je ne devrais pas créer une sous-classe NSManagedObject personnalisée ? Je ne comprends pas comment l'utiliser sur iOS 10 et Swift 3.

0 votes

Comment utiliser un Core Data sur iOS 10 et Swift 3 ?

0 votes

Comme je l'ai dit, je suis la réponse, vous pouvez créer vos propres sous-classes si vous le souhaitez, assurez-vous simplement que vous ne créez pas de doublons.

12voto

rustproofFish Points 347

J'ai en fait le même problème (en utilisant Swift) et je soupçonne qu'il s'agit d'un bug. Si je comprends bien, l'OP utilise les sous-classes NSManagedObject autogènes de Xcode et ne crée pas ensuite de sous-classes supplémentaires (superflues), ce qui semble être une source de confusion.

Étapes à reproduire :

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

  2. Créer une entité dans l'entité modèle, ajouter des propriétés, s'assurer que le fichier est sauvegardé (parfois Xcode 8 Beta jette les données si elles ne sont pas explicitement sauvegardées)

  3. Sélectionnez Editor -> Created NSManagedObject subclass. Cochez les cases pertinentes

Xcode crée 3 fichiers :

  1. NOM DU MODÈLE DE DONNÉES DE LA CORÉDA_CORÉDA_STRATÉGIE +CoreDataModel.swift. Ce fichier est corrompu et contient des entrées non valides à la suite des déclarations pour d'importer Foundation et CoreData - le projet ne sera pas compilé à moins que ce fichier soit supprimé

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

  3. Nom de l'entité+CoreDataProperties.swift

Bien que l'éditeur ne signale aucune erreur à ce stade, les tentatives de compilation échouent pour les raisons énumérées par le PO (à savoir des fichiers manquants avec les mêmes noms mais avec un préfixe '.' dans le dossier DerivedData).

Si vous créez les sous-classes de NSManagedObject manuellement après avoir créé votre modèle sans utiliser l'auto-gen de Xcode, qui est manifestement défectueux, il n'y a aucun problème. Un peu plus de saisie mais beaucoup plus fiable ! Cependant, vous devrez commencer à partir d'un projet " propre " (c'est-à-dire avant d'avoir essayé de générer automatiquement les sous-classes), sinon l'erreur persiste. Le nettoyage des données dérivées ne vous aidera pas, malheureusement.

***** MISE À JOUR ***** Il semble qu'il se passe quelque chose d'assez étrange et qu'il y ait une génération de code silencieuse comme cela avait été suggéré à l'origine (toutes mes excuses), mais ce comportement est 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 de DerivedData > Build > Intermediates > .Build.

Je comprends tout à fait pourquoi le PO était confus (comme je l'étais moi-même !). Pour ce que cela vaut, cette "fonctionnalité" est sans aucun doute une tentative d'être utile, mais elle est quelque peu déroutante si vous êtes habitué au comportement précédent et que l'on vous propose une option pour générer un duplicata visible et modifiable à partir du menu principal.

Sélectionnez donc "Manual/None" dans la fenêtre Codegen (illustrée ci-dessous) et vous pouvez ensuite utiliser l'option de génération automatique dans la barre de menu (après avoir supprimé le "junk") ou écrire votre propre code.

New XCode 8 codegen option

5voto

Baig Points 393

Suivez les étapes suivantes,

  1. Désactiver la génération automatique pour chaque entité individuellement en paramétrant en réglant le paramètre "Codegen" sur "Manual/None" pour l'entité.

  2. Changez le nom de l'entité en quelque chose d'autre pour qu'elle soit enregistrée. Par exemple changer le nom de la classe ; construire ; changer le nom de la classe à nouveau ; construire à nouveau.

2voto

J'ai eu cette erreur à,

Changez simplement la version de l'outil en Xcode 7.3 dans votre fichier .xcdatamodeld.

et cela fonctionne bien !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X