Question

Je suis en train d'ajouter des données de base à une application existante, qui ne considère pas facile que toute la documentation et chaque tutoriel commence avec la création d'une application qui utilise les données de base depuis le début. Donc, je suis en train de convertir une classe de modèle existant comme une entité de données de base. Voici ce que je l'ai fait:

  1. Ajoutez le cadre de données de base.
  2. Ajoutez un fichier xcdatamodel. Il m'a montré une boîte de dialogue où je pourrais ajouter une classe existante, donc j'ajouté mon modèle. Ensuite, je peaufiné les attributs et dit que ce que les types étaient.
  3. Au lieu de générer une nouvelle classe de modèle (depuis que je l'ai déjà un) je créé un projet de test pour voir ce qu'il ressemblerait, et ajusté ma classe pour correspondre. Cela comprenait changer d'hériter de NSManagedObject, en changeant mes propriétés à dynamique, la suppression des appels de libération, etc.
  4. Ajout les objets de base de données à mon délégué application, cet exemple.
  5. Dans mon ViewController, où j'alloc mon modèle, je l'ai changé à

    MyModel *model = (MyModel*)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel"] inManagedObjectContext:[delegate managedObjectContext];
    

Notez que délégué est une référence à mon délégué de l'application, a déclaré précédemment. Peut-être que ce n'est pas la façon intelligente de le faire.

Après avoir réglé toutes les propriétés, je:

    [[delegate managedObjectContext] save:&error];

Cette ligne tombe en panne, et dit que ce backtrace est à l'intérieur [NSSqlLiteConnection execute], environ 8 niveaux dans la fonction de sauvegarde. L'exception est:

*-[NSConcreteValue UTF8String]: unrecognized selector sent to instance*

Quelle est cette valeur concrète? Et pourquoi est-ce être appelé, par qui? Si cela importe, mon création / code de sauvegarde modèle est dans une fonction qui est un rappel pour un NSNotification. Est-ce sur un thread séparé? J'ai entendu que le managedObjectContext est pas thread-safe. Mais je ne reçois pas la même erreur j'attendre dans ce cas.

Était-ce utile?

La solution

Eh bien, je suis certain que vous avez une propriété déclarée NSString sur votre modèle de base de données (.xcdatamodel) qui est déclaré comme quelque chose d'autre (un NSNumber peut-être) sur votre modèle d'objet. Lors de la compilation de votre code, aucun avertissement sont générés mais quand CoreData essaie de sauver le moc (ex: l'écriture des données sur la mémoire persistante, AKA votre base de données SQLite)., Il échoue lorsque CoreData tente de convertir votre supposée NSString à UTF8

Vous devriez vérifier vos propriétés sur le modèle de base de données et le modèle objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top