2016-12-16 1 views
0

J'ai créé un modèle CoreData avec une entité "Nouvelles":Swift 3 | CoreData | Les entités personnalisées

enter image description here

Je l'ai mis à "Manuel/Aucune" et créé un NSManagedObject:

public class News: NSManagedObject { 

    @NSManaged var id: String 
    @NSManaged var newsType: Int16 
    @NSManaged var newsImageUrl: String 
    @NSManaged var newsVideoUrl: String 
    @NSManaged var newsTitle: String 
    @NSManaged var newsDesc: String 

} 

Je veux passer outre les propriétés de mon entité sans toucher le CoreData Model, juste en faisant ceci:

extension News { 
    @NSManaged var newsUrl: String 
} 

Bien sûr, si je faire:

news.newsUrl = "" 

je reçois une belle

raison: « - [NSManagedObject setNewsUrl:]: sélecteur non reconnu

Comment puis-je ajouter correctement nouvelles propriétés dans mon entité (sans modifier CoreData Model) et, bien sûr, je veux que cette propriété de nouvelles soit enregistrée dans CoreData?

TY

+0

Vous devez ajouter la propriété à votre entité dans le modèle. – shallowThought

+0

Il est donc maintenant possible d'ajouter une propriété dans un objet NSManagedObject sans modifier le modèle CoreData? Même si des extensions? Cela semble étrange! – Aximem

+0

La colonne ne peut pas exister dans la base de données si elle n'est pas définie dans votre modèle. – shallowThought

Répondre

1

L'approche que vous avez essayé ne fonctionne pas parce qu'il ne suffit pas de déclarer que la nouvelle propriété, vous devez faire cette propriété existe dans le modèle de données. Si vous ne modifiez pas le modèle, vous devez effectuer le travail dans votre code.

Vous pouvez modifier le modèle complet dans le code jusqu'à ce que vous commenciez à l'utiliser. Une fois que vous avez chargé votre fichier de stockage permanent, vous devez traiter le modèle d'objet en lecture seule. Les étapes de base seraient

  1. Demandez au NSManagedObjectModel pour son entities ou entitiesByName. Trouvez le NSEntityDescription approprié dans cette liste. Créez un nouveau NSAttributeDescription pour votre nouvelle propriété.
  2. Ajoutez le nouvel attribut au tableau properties sur l'entité.

Ce n'est pas une bonne idée, et je recommande fortement de ne pas le faire, mais ce n'est pas impossible. Au cours de nombreuses années de codage des données de base, je n'ai modifié le modèle qu'une fois dans le code, pour contourner un bogue (depuis corrigé) dans le compilateur du modèle. Gardez à l'esprit que cela ne vous permet pas d'éviter de migrer un modèle. Votre fichier de stockage persistant doit correspondre au modèle de données que vous utilisez. La modification du modèle dans le code rendra la gestion des versions du modèle plus difficile et augmentera les chances que l'application plante, car les modèles ne correspondent pas.

+0

Merci pour votre réponse Tom, c'est très clair – Aximem