2016-07-16 73 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. 将实体名称更改为其他名称以使其保存。例如 更改类名;建立;改回班级名称;再次建立 。