2016-12-16 4 views
0

Ich habe eine Coredata-Modell mit einer Entität "News":Swift 3 | CoreData | Benutzerdefinierte Entitäten

enter image description here

ich es auf "Manuel/None" und erstellt eine 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 

} 

Ich möchte außer Kraft setzen die Eigenschaften meiner Einheit, ohne das Coredata Modell zu berühren, nur durch dies zu tun:

extension News { 
    @NSManaged var newsUrl: String 
} 

natürlich, wenn ich tun:

news.newsUrl = "" 

ich einen schönen

Grund bekommen: ‚- [NSManagedObject setNewsUrl:]: Unbekannter Selektor

Wie kann ich richtig neue Eigenschaften in meinem Entity hinzufügen (ohne Änderung CoreData Model) und natürlich möchte ich, dass diese News-Eigenschaft in CoreData gespeichert wird?

TY

+0

Sie müssen die Eigenschaft zu Ihrer Entität im Modell hinzufügen. – shallowThought

+0

So gibt es nun eine Möglichkeit, eine Eigenschaft in einem NSManagedObject hinzuzufügen, ohne CoreData Model zu ändern? Auch wenn Erweiterungen? Es scheint seltsam! – Aximem

+0

Die Spalte kann nicht in der Datenbank vorhanden sein, wenn sie nicht in Ihrem Modell definiert ist. – shallowThought

Antwort

1

Der Ansatz nicht funktioniert, versucht, weil es nicht genug, nur die neue Eigenschaft zu erklären, können Sie diese Eigenschaft existieren im Datenmodell zu machen. Wenn Sie das Modell nicht bearbeiten, müssen Sie die Arbeit in Ihrem Code erledigen.

Sie können das gesamte Modell in Code ändern bis starten Sie es. Sobald Sie Ihre persistente Speicherdatei geladen haben, müssen Sie das Objektmodell als schreibgeschützt behandeln. Die grundlegenden Schritte wäre

  1. die für seine NSManagedObjectModel Stellen Sie entities oder entitiesByName.
  2. Finden Sie das entsprechende NSEntityDescription in dieser Liste.
  3. Erstellen Sie eine neue NSAttributeDescription für Ihre neue Eigenschaft.
  4. Fügen Sie das neue Attribut zum Array properties der Entität hinzu.

Dies ist keine gute Idee, und ich empfehle dringend, es nicht zu tun, aber es ist nicht unmöglich. In vielen Jahren von Core Data Coding habe ich das Modell nur einmal im Code modifiziert, um einen (seither behobenen) Fehler im Modell-Compiler zu umgehen.

Beachten Sie, dass dies die Modellmigration nicht verhindert. Ihre persistente Speicherdatei muss mit dem von Ihnen verwendeten Datenmodell übereinstimmen. Das Modifizieren des Modells im Code wird das Verwalten von Modellversionen erschweren und die Wahrscheinlichkeit erhöhen, dass die App abstürzt, weil die Modelle nicht übereinstimmen.

+0

Danke für deine Antwort Tom, das ist sehr klar – Aximem

Verwandte Themen