web-dev-qa-db-fra.com

Données de base: impossible de convertir la valeur de type «MyType_MyType_2» en MyType

J'ai une classe de modèle Objective-C MyType. Cette classe est utilisée dans Swift code:

NSEntityDescription.insertNewObjectForEntityForName("MyType", inManagedObjectContext: context) as! MyType

Le as! cast génère le message d'erreur

Core Data: Could not cast value of type 'MyType_MyType_2' (0x7be99a30) to MyType (0xf33db74).

Si je le transforme en NSManagedObject cela fonctionne. Lorsque j'imprime le résultat, je peux néanmoins voir qu'il s'agit d'une instance réelle de MyType:

<MyType: 0x7ae06d50> (entity: MyType; id: 0x7aeba6d0 <x-coredata:///MyType/t957F2860-85F8-46E0-B6D6-4D1DF6C4EC613> ; data: { 
    ...the fields...
})

Que se passe-t-il ici? Et d'où vient le nom MyType_MyType_2 viens de?

28
Bastian

Lorsque j'ai eu ce problème, c'est parce que j'avais oublié de définir la "classe" sur l'entité. Voici ce que j'ai trouvé:

  1. Cliquez sur le fichier .xcdatamodelId dans votre volet de structure de fichiers/navigateur de projet (à l'extrême gauche).
  2. Sélectionnez l'entité avec laquelle vous rencontrez des problèmes.
  3. Dans le volet Utilitaires (à l'extrême droite), recherchez l'icône qui ressemble à un téléphone portable 1997, l'inspecteur de modèle de données.
  4. Sous les paramètres d'entité, vous devriez voir deux champs, "Nom" et "Classe" - configurer "Classe" avec le nom de la classe que vous utilisez (généralement le même que "Nom").

Vous remarquerez même avant de suivre ces étapes que la "classe" par défaut est NSObject, reflétant le message d'erreur. J'ai également trouvé des moyens programmatiques de le faire, mais cela semblait être la solution la plus simple/la plus rapide.

Je dois noter que mon modèle était écrit en Swift, j'ai donc dû ajouter la référence d'interopérabilité @objc (Entity) mentionnée par @zellb. Mais cela ne devrait pas faire de différence dans la solution tant que vous faites cette partie correctement (et cela provoquerait une erreur non liée différente de ma compréhension).

39
Bourne
  1. Définir le nom de la classe d'entité
  2. Définissez le module "Module de produit actuel" comme ci-dessous

enter image description here

33
Cody

essayez ceci:

@objc(MyType)
public class MyType: NSManagedObject {
    // your class
}

au lieu de cela:

class MyType: NSManagedObject {
    // your class
}
5
wajih

J'avais par erreur défini une "entité parent" dans l'une de mes entités dans l'inspecteur de modèle de données dans la section entité. J'ai pensé à tort que cela faisait référence à la destination d'une relation un-à-plusieurs.

Le redéfinir sur "aucune entité parent" a résolu le problème, même si j'ai dû supprimer et réinstaller l'application dans le simulateur pour gérer la base de données de données de base foirée.

0
Darrell Root