2016-12-16 129 views
0

我創建了一個CoreData模型實體「新聞報」:Swift 3 | CoreData |自定義實體

enter image description here

我將它設置爲「曼努埃爾/無」,並創建了一個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 

} 

我要重寫我的實體的屬性沒有觸及CoreData模型,只是這樣做:

extension News { 
    @NSManaged var newsUrl: String 
} 

當然,如果我這樣做:

news.newsUrl = "" 

我得到一個不錯的

原因:「 - [NSManagedObject setNewsUrl:]:無法識別選擇

我怎麼能在我的實體添加適當的新特性(不修改CoreData Model),當然,我希望將這個新聞屬性保存在CoreData中?

TY

+0

您必須將屬性添加到模型中的實體。 – shallowThought

+0

因此,現在有辦法在不修改CoreData Model的情況下在NSManagedObject中添加屬性?即使擴展?這似乎很奇怪! – Aximem

+0

如果在模型中沒有定義該列,該列不能存在於數據庫中。 – shallowThought

回答

1

你試過沒有工作,因爲它是不夠的,只是聲明新的屬性的方法,你不得不做出這樣的特性存在於數據模型。如果您不編輯模型,則必須在代碼中完成這項工作。

您可以在代碼中修改整個模型,直到您開始使用它。加載持久性存儲文件後,必須將對象模型視爲只讀。基本步驟是

  1. 詢問NSManagedObjectModelentitiesentitiesByName
  2. 在該列表中找到合適的NSEntityDescription
  3. 爲您的新房產創建新的NSAttributeDescription
  4. 將新屬性添加到實體上的properties數組。

這不是一個好主意,我強烈建議不要這樣做,但這並非不可能。在多年的Core Data編碼中,我只修改了一次代碼中的模型,以解決模型編譯器中的(因爲固定的)錯誤。

請記住,這不會讓您避免模型遷移。您的永久存儲文件必須與您使用的數據模型相匹配。在代碼中修改模型會使管理模型版本變得更加困難,並且會增加應用程序崩潰的機率,因爲模型不匹配。

+0

謝謝你的回答湯姆,這很清楚 – Aximem