Xcode-beta 8.无法创build核心数据
我一直在试图添加核心数据。 每次我得到同样的错误:
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; 保存在我的项目的根目录
selectModel.xcdatamodeld并添加实体,添加几个属性,保存,编辑器/创buildNSManagedObjectClass子类。
因此,我在导航器中观察到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.清理构build,删除DerivedData,删除var /文件夹的内容,重新启动
2.删除生成的文件,显示在导航器中
我所有的努力都是运气不好的。
我做错了什么?
当模型文件使用Xcode 8文件格式时,Xcode 8包括自动NSManagedObject
类的生成。 如果你创build你自己的子类文件,你正在创build重复。 DerivedSources
错误消息中的第二个文件是Xcode自动创build的文件。
如果自动生成的文件做你所需要的,只是停止创build自己的,你会没事的。
如果你想创build自己的子类,你也可以
- 将模型文件的“工具版本”设置为Xcode 7.3或更低版本以禁用所有代码生成(这似乎没有改变对于实际文件内容有意义的任何内容),或者
- 通过将实体的“Codegen”设置为“Manual / None”,为每个实体单独禁用自动生成。
XCode 8中有两个错误:
1 – 如果您更改Codegen下拉菜单,则新值不保存在Model.xcdatamodel中。 你必须改变别的东西才能保存。 例如更改类名称; build立; 改回class级名称; 重新build立。
2 – 生成的代码放置在Intermediates文件夹的DerivedData中,但只有在文件夹不存在的情况下才会发生。 解决方法是做一个干净的然后构build。
我实际上有同样的问题(使用Swift),并怀疑这是一个错误。 如果我理解正确的OP是使用Xcode的自动NSManagedObject子类,并没有随后创build额外的(多余的)子类似乎是一些混淆的来源。
重现步骤:
-
创build一个新的项目,单个视图应用程序。 勾选“使用核心数据”
-
在模型实体中创build一个实体,添加属性,确保文件被保存(有时如果没有明确保存,Xcode 8 Beta会抛出数据)
- select编辑器 – >创buildNSManagedObject子类。 勾选相关的框
Xcode创build3个文件:
-
COREDATA_DATAMODELNAME_ + CoreDataModel.swift。 该文件已损坏,并包含以下用于导入Foundation和CoreData的无效条目 – 除非删除此文件,否则该项目将无法编译
import Foundation import CoreData ___COREDATA_DATAMODEL_MANAGEDOBJECTCLASSES_IMPLEMENTATIONS___
-
实体名称+ CoreDataClass.swift
-
实体名称+ CoreDataProperties.swift
虽然编辑器此时不会标记任何错误,但由于OP列出的原因(即缺lessDerivedData文件夹中具有相同名称但具有'。'前缀的文件)
如果在创build模型之后手动创buildNSManagedObject子类而不使用Xcode的明显错误的自动生成,则没有任何问题。 多一点打字,但更可靠! 但是,您需要从“干净的”项目开始(即在您试图自动生成子类之前),否则错误仍然存在。 清理派生数据不会伤心。
*****更新*****似乎有一些相当奇怪的事情,似乎是最初build议的沉默代码生成(道歉),但这是非常不同的行为,从人们的期望。 而且,这个代码在编辑器中是不可见的(这看起来有点没有意义,也很混乱)。 它在DerivedData> Build> Intermediates> .Build的子文件夹中创build。
我可以完全明白为什么OP是困惑的(就像我!)为什么值得这个“function”无疑是一个有益的尝试,但有点混乱,如果你习惯了以前的行为,并提供一个选项来产生从主菜单中可见和可编辑的副本。
因此,在Codegen窗口(如下所示)中select'Manual / None',然后您可以使用菜单栏中的auto-gen选项(删除'junk'之后)或编写自己的代码。
按着这些次序,
-
通过将实体的“Codegen”设置为“Manual / None”,为每个实体单独禁用自动生成。
-
将实体名称更改为其他名称以便保存。 例如更改类名称; build立; 改回class级名称; 重新build立。
我得到这个错误,
只需在您的文件.xcdatamodeld中将工具版本更改为Xcode 7.3即可
它工作正常!
对于每个人都有麻烦让自动工作:
我必须在实体的用户信息设置上将“com.apple.syncservices.Syncable”设置为“NO”。
也许这有帮助。
Tom Harrington答案是正确的。 但是,有一种方法可以添加自己的函数和/或variables,而不需要执行上述两个选项中的任何一个。
只需创build一个类的扩展 。 (确保你命名的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 } } } }
尝试了几个贴子的答案后,重新启动我的机器为我工作。
- 核心数据迁移示例或说明多个通行证?
- 我怎样才能投到NSManagedObject但不是我的实体的types?
- NSFetchedResultsController与UILocalizedIndexedCollation
- 多个(两个)持久性存储可以与一个对象模型一起使用,同时保持从一个到另一个的关系?
- 如何sorting包含NSManagedObject子类的实例的swift数组(按date)
- 在自动代码中无效重新生成NSManagedObject Subclass Swift 3
- 核心数据VS Sqlite或FMDB …?
- 在iOS 5上实现快速有效的核心数据导入
- 核心数据“使用原始数据types的标量属性”checkbox