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.New 文件/数据模型;将它保存在我项目的根目录中
select Model.xcdatamodeld 并添加实体,添加几个属性,保存, editor/create 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/folders 的内容,重新启动
2.删除生成的文件,显示在navigator

我所有的努力都失败了。
我做错了什么?

当模型文件使用 Xcode 8 文件格式时,

Xcode 8 包括自动 NSManagedObject class 生成。如果您创建自己的 subclass 文件,您就是在创建副本。 DerivedSources 中错误消息中的第二个文件是 Xcode 自动创建的文件。

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

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

  • 将模型文件的 "tools version" 设置为 Xcode 7.3 或更早版本以禁用所有代码生成(这似乎不会改变任何对实际文件内容有意义的内容),或者
  • 通过将实体的 "Codegen" 设置设置为 "Manual/None" 分别禁用每个实体的自动生成。

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

重现步骤:

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

  2. 在模型实体中创建一个实体,添加属性,确保文件是 已保存(有时 Xcode 8 Beta 会在未明确显示的情况下抛出数据 已保存)

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

Xcode 创建了 3 个文件:

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

    import Foundation
    
    import CoreData
    
    ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
    
  2. 实体名称+CoreDataClass.swift

  3. 实体名称+CoreDataProperties.swift

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

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

***** 已更新 ***** 似乎确实发生了一些相当奇怪的事情,并且确实如最初建议的那样静默代码生成(道歉),但这与人们预期的行为非常不同。此外,这段代码在编辑器中是不可见的(这看起来有点毫无意义而且令人困惑)。它是在 DerivedData > Build > Intermediates > .Build.

的子文件夹中创建的

我完全明白为什么 OP 感到困惑(就像我一样!)对于它的价值,'feature' 无疑是一种提供帮助的尝试,但如果您习惯了以前的行为和您可以选择从主菜单生成可见且可编辑的副本。

所以,select 'Manual/None' 在 Codegen window(如下所示),然后你可以使用菜单栏中的自动生成选项(删除 'junk') 或编写您自己的代码。

对于在使用 autogen 时遇到问题的每个人:

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

也许这有帮助。

XCode 8 这里有两个错误:

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

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

我收到这个错误,

只需将文件 .xcdatamodeld

中的工具版本更改为 Xcode 7.3

而且效果很好!

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

只需 创建 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
            }
        }
    }

}

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

按照这些步骤,

  1. 通过设置分别禁用每个实体的自动生成 实体的 "Codegen" 设置为 "Manual/None"。

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

删除 "Build phases" 选项卡中的编译文件核心数据 "Compile source" 按下 -