【问题标题】:Xcode-beta 8. Can't create core dataXcode-beta 8. 无法创建核心数据
【发布时间】:2016-11-19 10:18:05
【问题描述】:

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

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.新建文件/数据模型;将其保存在我项目的根目录中
选择 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.删除生成的文件,显示在导航器中

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

【问题讨论】:

    标签: ios swift core-data xcode8


    【解决方案1】:

    XCode 8 中有两个 bug:

    1 - 如果您更改 Codegen 下拉菜单,它的新值不会保存在 Model.xcdatamodel 中。您必须更改其他内容才能保存。例如更改类名;建造;改回类名;重新构建。

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

    【讨论】:

    • 这需要标记为正确答案。更改名称、构建、改回、重新构建修复了我的错误。
    • 你是救生员!谁会怀疑 Codegen 下拉设置没有保存?
    • 你刚刚救了我!这个关于更改模型类中的某些内容以保存代码生成设置的技巧 - 太棒了!谢谢!
    • 为了明确一件事,您应该选择的选项是Manual/None,对吧?我知道在以前的版本中它生成了两个文件,我认为这是为了对非生成代码进行子类化和更改,例如添加自定义代码???
    【解决方案2】:

    当模型文件使用 Xcode 8 文件格式时,Xcode 8 会自动生成 NSManagedObject 类。如果您创建自己的子类文件,那么您就是在创建重复项。错误消息中的第二个文件 DerivedSources 是 Xcode 自动创建的文件。

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

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

    • 将模型文件的“工具版本”设置为 Xcode 7.3 或更早版本以禁用所有代码生成(这似乎对实际文件内容没有任何意义),或者
    • 通过将实体的“代码生成”设置设置为“手动/无”来单独禁用每个实体的自动生成。

    【讨论】:

    • 您好!我不应该创建自定义 NSManagedObject 子类吗?我不明白如何在 iOS 10 和 Swift 3 上使用它。
    • 如何在 iOS 10 和 Swift 3 上使用核心数据?
    • 就像我说的那样,我就是答案,您可以根据需要创建自己的子类,只要确保没有创建重复项。
    • 我已禁用自动子类生成,并尝试创建自定义 NSManagedObject 子类。但这是一个像 `_COREDATA_DATAMODELNAME_+CoreDataModel.swift ` 这样的错误,并且这个文件带有一些错误消息。
    • 如果您需要帮助,请提出另一个问题。在其他问题的 cmets 中对此进行散列是没有意义的。
    【解决方案3】:

    我实际上遇到了同样的问题(使用 Swift)并怀疑这是一个错误。如果我理解正确,OP 正在使用 Xcode 的 autogen NSManagedObject 子类,并且随后没有创建其他(多余的)子类,这似乎是一些混乱的根源。

    重现步骤:

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

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

    3. 选择编辑器 -> 创建 NSManagedObject 子类。勾选相关 盒子

    Xcode 创建 3 个文件:

    1. COREDATA_DATAMODELNAME_+CoreDataModel.swift。这个文件是 损坏并包含以下语句的无效条目 导入 Foundation 和 CoreData - 项目不会编译,除非 此文件已删除

      import Foundation
      
      import CoreData
      
      ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
      
    2. EntityName+CoreDataClass.swift

    3. EntityName+CoreDataProperties.swift

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

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

    ***** 已更新 ***** 似乎确实发生了一些相当奇怪的事情,并且确实出现了最初建议的静默代码生成(道歉),但这与人们所期望的行为截然不同。此外,此代码在编辑器中不可见(这似乎有点无意义且令人困惑)。它是在 DerivedData > Build > Intermediates > .Build 的子文件夹中创建的。

    我完全可以理解为什么 OP 会感到困惑(就像我一样!)因为它的价值,这个“功能”无疑是一种有用的尝试,但如果你习惯了以前的行为并且你被提供了一个从主菜单生成可见且可编辑的副本的选项。

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

    【讨论】:

      【解决方案4】:

      按照这些步骤,

      1. 通过设置单独禁用每个实体的自动生成 实体的“Codegen”设置为“Manual/None”。

      2. 将实体名称更改为其他名称以保存它。例如 更改班级名称;建造;改回类名;建造 再次。

      【讨论】:

        【解决方案5】:

        我得到了这个错误,

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

        而且效果很好!

        【讨论】:

          【解决方案6】:

          对于所有无法让 autogen 工作的人:

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

          也许这会有所帮助。

          【讨论】:

          • “让 autogen 工作”是什么意思?您的意思是将 Codegen 设置为“类定义”还是“类别/扩展”?
          【解决方案7】:

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

          只需为类创建一个扩展。 (确保您将 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
                      }
                  }
              }
          
          }
          

          【讨论】:

            【解决方案8】:

            在尝试了一些已发布的答案后,重新启动我的机器对我有用。

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 2023-03-29
                • 2015-10-28
                • 1970-01-01
                • 1970-01-01
                • 2014-06-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-11-23
                相关资源
                最近更新 更多