2016-07-16 74 views
39

我一直在嘗試添加核心數據。 每一次我得到了同樣的錯誤時間:Xcode-beta 8.無法創建核心數據

error: filename "EntityName +CoreDataClass.swift" used twice: '/Users/userName/Desktop/Development/MyApp/AppName/EntityName +CoreDataClass.swift' and '/Users/userName/Library/Developer/Xcode/DerivedData/AppName-dgwzrmxsetzvtedibxrazuutjwnh/Build/Intermediates/AppName.build/Debug-iphoneos/AppName.build/DerivedSources/CoreDataGenerated/Model/EntityName +CoreDataClass.swift' 

我使用以下步驟核心數據補充:
1.New文件/ DataModel的;保存在我的項目的根目錄
選擇Model.xcdatamodeld並添加實體,添加幾個屬性,保存,編輯/創建NSManagedObjectClass子類。

因此,我觀察導航4個新的文件: Model.xcdatamodeld,實體名稱+ CoreDataProperties.swift,實體名稱+ CoreDataClass.swift,_COREDATA_DATAMODELNAME_ + CoreDataModel.swift

的內容: _COREDATA_DATAMODELNAME_ + CoreDataModel.swift:

import Foundation 
import CoreData 

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___ 

實體名稱+ CoreDataClass.swift:

import Foundation 
import CoreData 


class EntityName: NSManagedObject { 

} 

實體名稱+ CoreDataProperties.swift:

import Foundation 
import CoreData 

extension EntityName { 

    @nonobjc class func fetchRequest() -> NSFetchRequest<EntityName> { 
     return NSFetchRequest<EntityName>(entityName: "EntityName"); 
    } 

    @NSManaged var str: String? 

} 

我曾嘗試:
1.清潔的身材,去除DerivedData,刪除VAR /文件夾的內容,請重新啓動
2.刪除生成的文件,顯示在導航儀上

我所有的努力都是運氣不好。
我做錯了什麼?

回答

46

當模型文件使用Xcode 8文件格式時,Xcode 8包括自動生成類NSManagedObject。如果您創建自己的子類文件,則會創建重複項。錯誤消息中的第二個文件是DerivedSources,它是Xcode自動創建的文件。

如果自動生成的文件做你所需要的,只需停止創建你自己的,你會沒事的。

如果你想,而不是創建自己的子類,你可以

  • 設置「工具版」爲模型文件是Xcode的7.3或更早版本禁用所有代碼生成(這似乎並不以更改對實際文件內容有意義的任何內容),或
  • 通過將實體的「Codegen」設置設置爲「Manual/None」,爲每個實體單獨禁用自動生成。
+0

您好!我不應該創建一個自定義的NSManagedObject子類?我不明白如何在iOS 10和Swift 3上使用它。 –

+0

如何在iOS 10和Swift 3上使用Core Data? –

+0

就像我說的我是答案,如果你願意,你可以創建你自己的子類,只要確保你沒有創建重複。 –

12

我實際上有同樣的問題(使用Swift),並懷疑它是一個錯誤。如果我理解正確,OP使用Xcode的autogen NSManagedObject子類,並且不會隨後創建額外的(多餘的)子類,這似乎是一些混淆的來源。

重現步驟:

  1. 創建一個新的項目,單一視圖的應用程序。勾選「使用核心數據」

  2. 創建模型實體的實體,添加屬性,確保文件 保存(有時Xcode中8 Beta中拋出,如果沒有明確 保存的數據)

  3. 選擇編輯 - 創建> 。NSManagedObject子類勾選相關 箱

Xcode創建3個文件:

  1. COREDATA_DATAMODELNAME_ + CoreDataModel.swift。此文件 損壞,幷包含以下語句, 進口基金會和CoreData非有效的條目 - 該項目將無法編譯,除非 此文件被刪除

    import Foundation 
    
    import CoreData 
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___ 
    
  2. 實體名稱+ CoreDataClass.swift

  3. 實體名稱+ CoreDataProperties.swift

儘管編輯器此時沒有標記任何錯誤,但嘗試編譯失敗r由OP列出的原因(即在DerivedData文件夾中丟失具有相同名稱但具有'。'前綴的文件)

如果在創建模型之後手動創建NSManagedObject子類而不使用Xcode的明顯錯誤的自動生成,沒有問題。多一點打字,但更可靠!但是,您需要從「乾淨的」項目開始(即在您試圖自動生成子類之前),否則錯誤仍然存​​在。清理派生數據不會傷心。

***** UPDATED ***** 似乎有一些相當奇怪的事情發生,似乎是最初建議的沉默代碼生成(道歉),但這是非常不同的行爲會期待。而且,這段代碼在編輯器中是不可見的(這看起來有點無意義而且令人困惑)。它在DerivedData> Build> Intermediates> .Build的子文件夾中創建。

我完全可以看出OP爲什麼會感到困惑(就像是我!)對於這個'功能'來說這無疑是一種嘗試,但是如果你習慣了以前的行爲並且提供給你從主菜單生成可見和可編輯副本的選項。

因此,在Codegen窗口(如下所示)中選擇'Manual/None',然後您可以使用菜單欄中的自動生成選項(刪除'垃圾'後)或編寫自己的代碼。

New XCode 8 codegen option

0

對於有大家麻煩AUTOGEN工作:

我不得不設置「com.apple.syncservices.Syncable」到「NO」上的用戶對實體信息的設置。

也許有幫助。

+0

「讓自動工作」是什麼意思?你的意思是將Codegen設置爲「Class Definition」或「Category/Extension」嗎? –

51

有XCode中8這裏有兩個錯誤:

1 - 如果你改變了代碼生成下拉列表中,它的新值不會保存在Model.xcdatamodel。你必須改變別的東西才能保存。例如更改類名稱;建立;改回班級名稱;再次建立。

2 - 生成的代碼放置在Intermediates文件夾的DerivedData中,但只有在文件夾不存在的情況下才會發生。解決方法是做一個乾淨的然後構建。

+6

這需要標記爲正確的答案。更改名稱,構建,更改,重建修復了我的錯誤。 – Mike

+4

你是一個拯救生命的人!誰會懷疑Codegen下拉設置沒有保存? – Rick

+0

你剛剛救了我!這個關於在模型類中改變某些東西以節省代碼集設置的技巧 - 太棒了!謝謝! – iiFreeman

2

我得到這個錯誤,

只是工具版本Xcode的7.3文件.xcdatamodeld

,它工作正常的變化!

0

湯姆哈靈頓答案是正確的。但是,有一種方法可以添加自己的函數和/或變量,而不需要執行上述兩個選項中的任何一個。

只需創建類的擴展。 (請確保將swift文件命名爲與標準自動生成的NSManagesObject文件不同的內容。)

例如,如果你有一個名爲實體MyEntity你可以添加一個名爲MyEntityExtension.swift迅速的文件,它可能是這個樣子:

import Foundation 
import CoreData 
import UIKit 


extension MyEntity { 

    var color: UIColor { 
     get { 
      return self.colorValue as! UIColor 
     } 
     set { 
      if newValue.isMember(of: UIColor.self) { 
       self.colorValue = newValue 
      } 
     } 
    } 

} 
0

試圖貼出答案了一把後,重新啓動我的機器爲我工作。

5

這些步驟,

  1. 禁用自動生成對於每個實體單獨地通過設置 的「代碼生成」設置爲「手動/無」的實體。

  2. 將實體名稱更改爲其他名稱以使其保存。例如 更改類名;建立;改回班級名稱;再次建立 。