簡體   English   中英

Xcode-beta 8.無法創建核心數據

[英]Xcode-beta 8. Can't create core data

我一直在嘗試添加核心數據。 每次我得到同樣的錯誤:

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.新文件/ DataModel; 將其保存在我項目的根目錄中
選擇Model.xcdatamodeld並添加實體,添加幾個屬性,保存,編輯/創建NSManagedObjectClass子類。

因此,我在導航器中觀察到4個新文件:Model.xcdatamodeld,EntityName + CoreDataProperties.swift,EntityName + CoreDataClass.swift, _COREDATA_DATAMODELNAME_ + CoreDataModel.swift

他們的內容: _COREDATA_DATAMODELNAME_ + CoreDataModel.swift:

import Foundation
import CoreData

___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___

EntityName + 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.刪除導航器中顯示的生成文件

我所有的努力都沒有運氣。
我做錯了什么?

XCode 8中有兩個錯誤:

1 - 如果更改Codegen下拉列表,則其新值不會保存在Model.xcdatamodel中。 您必須更改其他內容才能保存。 例如,更改類名; 建立; 改回班級名稱; 再建一次。

2 - 生成的代碼放在Intermediates文件夾中的DerivedData中,但只有在文件夾不存在時才會發生。 解決方法是執行清理然后構建。

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

如果自動生成的文件能夠滿足您的需求,那就停止創建自己的文件,您就可以了。

如果您想要創建自己的子類,您也可以

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

我實際上遇到了同樣的問題(使用Swift),並懷疑它是一個bug。 如果我正確理解OP正在使用Xcode的autogen NSManagedObject子類,那么隨后就不會創建額外的(多余的)子類,這似乎是一些混亂的根源。

重現步驟:

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

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

  3. 選擇Editor - > Created NSManagedObject子類。 勾選相關方框

Xcode創建3個文件:

  1. COREDATA_DATAMODELNAME_ + CoreDataModel.swift。 此文件已損壞,並且包含導入Foundation和CoreData的語句后面的無效條目 - 除非刪除此文件,否則項目將無法編譯

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

  3. 實體名稱+ CoreDataProperties.swift

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

如果在創建模型后手動創建NSManagedObject子類而不使用Xcode明顯錯誤的auto-gen,則沒有問題。 打字更多但更可靠! 但是,您需要從“干凈”項目開始(即在嘗試自動生成子類之前),否則錯誤仍然存​​在。 清理派生數據無濟於事。

*****更新*****似乎確實有一些奇怪的事情,似乎確實存在最初建議的靜默代碼生成(道歉),但這與人們的期望非常不同。 此外,這個代碼在編輯器中不可見(這似乎有點無意義和混亂)。 它是在DerivedData> Build> Intermediates> .Build的子文件夾中創建的。

我完全可以理解為什么OP被混淆了(就像我一樣!)對於它的價值而言,這個'功能'無疑是一種有用的嘗試,但如果你已經習慣了以前的行為並且你有一個生成選項,那就有點令人困惑主菜單中的可見和可編輯副本。

因此,在Codegen窗口中選擇“Manual / None”(如下所示),然后您可以使用菜單欄中的auto-gen選項(刪除'junk'后)或編寫自己的代碼。

新的XCode 8 codegen選項

跟着這些步驟,

  1. 通過將實體的“Codegen”設置設置為“Manual / None”,可以單獨禁用每個實體的自動生成。

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

我收到此錯誤,

只需將工具版本更改為文件.xcdatamodeld中的Xcode 7.3即可

它工作正常!

對於每個人都無法讓autogen工作:

我必須在實體的用戶信息設置上將“com.apple.syncservices.Syncable”設置為“NO”。

也許這會有所幫助。

Tom Harrington答案是對的。 但是,有一種方法可以添加您自己的函數和/或變量,而無需執行上述兩個選項中的任何一個。

只需創建一個類的擴展 (確保將swift文件命名為與標准自動生成的NSManagesObject文件不同的名稱。)

例如。 如果你有一個名為MyEntity的實體,你可以添加一個名為MyEntityExtension.swift的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
            }
        }
    }

}

在嘗試了一些已發布的答案后,重新啟動我的機器為我工作。

按下“構建階段”部分“編譯源”選項卡中的刪除編譯文件核心數據 -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM