首页 文章

Xcode-beta 8.无法创建核心数据

提问于
浏览
39

我一直在尝试添加核心数据 . 每次我得到同样的错误:

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 {

}

EntityName 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.删除导航器中显示的生成文件

我所有的努力都没有运气 .
我做错了什么?

9 回答

  • 5

    当模型文件使用Xcode 8文件格式时,Xcode 8包括自动 NSManagedObject 类生成 . 如果您创建自己的子类文件,则表示您正在创建重复项 . 错误消息中的第二个文件 DerivedSources 是Xcode自动创建的文件 .

    如果自动生成的文件能够满足您的需求,那就停止创建自己的文件,您就可以了 .

    如果您想要创建自己的子类,您也可以

    • 将模型文件的"tools version"设置为Xcode 7.3或更早版本以禁用所有代码生成(这似乎不会改变对实际文件内容有意义的任何内容),或者

    • 通过将实体的"Codegen"设置为"Manual/None",可以单独禁用每个实体的自动生成 .

  • 12

    XCode 8中有两个错误:

    1 - 如果更改Codegen下拉列表,则其新值不会保存在Model.xcdatamodel中 . 您必须更改其他内容才能保存 . 例如,更改类名; Build ;改回 class 名称;再建一次 .

    2 - 生成的代码放在Intermediates文件夹中的DerivedData中,但只有在文件夹不存在时才会发生 . 解决方法是执行清理然后构建 .

  • 0

    我实际上遇到了同样的问题(使用Swift),并怀疑它是一个bug . 如果我正确理解OP正在使用Xcode的autogen NSManagedObject子类,那么随后就不会创建额外的(多余的)子类,这似乎是一些混乱的根源 .

    重现步骤:

    • 创建一个新项目,单一视图应用程序 . 勾选“使用核心数据”

    • 在模型实体中创建实体,添加属性,确保保存文件(如果未明确保存,有时Xcode 8 Beta会抛出数据)

    • 选择编辑器 - >创建NSManagedObject子类 . 勾选相关方框

    Xcode创建3个文件:

    • COREDATA_DATAMODELNAME_ CoreDataModel.swift . 此文件已损坏,并且包含导入Foundation和CoreData的语句后面的无效条目 - 除非删除此文件,否则项目将无法编译
    import Foundation
    
    import CoreData
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
    
    • EntityName CoreDataClass.swift

    • EntityName CoreDataProperties.swift

    虽然编辑器此时没有标记任何错误,但由于OP列出的原因(即缺少具有相同名称但在DerivedData文件夹中带有' . '前缀的文件),尝试编译失败

    如果在创建模型后手动创建NSManagedObject子类而不使用Xcode明显错误的auto-gen,则没有问题 . 打字更多但更可靠!但是,您需要从“干净”项目开始(即在尝试自动生成子类之前),否则错误仍然存在 . 清理派生数据无济于事 .

    ***更新***似乎确实有一些奇怪的事情,似乎确实存在最初建议的静默代码生成(道歉),但这与人们的期望非常不同 . 此外,这个代码在编辑器中不可见(这似乎有点无意义和混乱) . 它是在DerivedData> Build> Intermediates> .Build的子文件夹中创建的 .

    我完全可以理解为什么OP被混淆了(就像我一样!)对于它的 Value 而言,这个'功能'无疑是一种有用的尝试,但如果你习惯了以前的行为并且你有一个生成选项,那就有点令人困惑主菜单中的可见和可编辑副本 .

    因此,在Codegen窗口中选择“Manual / None”(如下所示),然后您可以使用菜单栏中的auto-gen选项(删除后)'垃圾')或编写自己的代码 .

    New XCode 8 codegen option

  • 2

    跟着这些步骤,

    • 通过将实体的“Codegen”设置设置为“Manual / None”,可以单独禁用每个实体的自动生成 .

    • 将实体名称更改为其他名称以使其保存 . 例如,更改类名; Build ;改回 class 名称;再建一次 .

  • 45

    我收到此错误,

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

    它工作正常!

  • 0

    对于每个人都无法让autogen工作:

    我必须在实体的用户信息设置上将“com.apple.syncservices.Syncable”设置为“NO” .

    也许这会有所帮助 .

  • 0

    Tom Harrington答案是对的 . 但是,有一种方法可以添加您自己的函数和/或变量,而无需执行上述两个选项中的任何一个 .

    只是 create an extension to the class . (确保将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
                }
            }
        }
    
    }
    
  • 0

    在尝试了一些已发布的答案后,重启我的机器为我工作了 .

  • 52

    按下“构建阶段”部分“编译源”选项卡中的删除编译文件核心数据 -

相关问题