swift - Xcode 生成的 CoreData 文件无法被 Copy Bundle Resources 构建阶段处理
问题描述
我将 CoreData 添加到我的应用程序中MY_APP
:
- 我通过创建一个包含具有几个属性
xcdatamodeld
的单个实体的文件来定义数据模型。XXX
- 使用 Xcode/Editor/Create NSManagedSubclass,Xcode 创建了 2 个文件,
XXX+CoreDataClass.swift
并且XXX+CoreDataProperties.swift
. - 我写了一些代码来测试存储并从核心数据中取回,一切正常。
问题:
在构建阶段开始时,我收到 3 个警告:
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataClass.swift"
cannot be processed by a Copy Bundle Resources build phase (in target ‚MY_APP‘)
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataProperties.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/MY_APP+CoreDataModel.swift"
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')
这 3 个文件未在 MY_APP 目标/构建阶段/复制捆绑资源下列出。
我的问题:
我的构建设置有什么问题,即这些警告的原因是什么,我该如何避免?
备注:此问题涉及不同的框架(核心数据),但与此类似,尚无答案。
编辑:
我的项目有 2 个目标,用于 iOS 和 watchOS。到目前为止,核心数据仅在 iOS 上使用。
我现在尝试也为 watchOS 启用它,但我收到一个错误,因为它还.xcdatamodeld
没有在 Build Phases / Copy Bundle Resources 中。
一旦我在那里添加它,核心数据就在手表上正确执行。
但是: 我收到了与上述相同的 3 个警告,这一次是针对手表扩展目标(总共 6 个警告)。
也许这是一个有用的提示。
解决方案
编辑:
我联系了 Apple,他们提供了解决方案:
当使用 coreData 选项创建 Xcode 项目“xxx”时,会创建核心数据模型文件“xxx.xcdatamodeld”并将其添加到目标 Build Phases Compile Sources。
比如说,在那里添加一个具有“属性”属性的实体“实体”。
如果在 Xcode 项目导航器中选择此模型文件并打开文件检查器,则会出现一个“代码生成”条目,默认设置为 Swift。这会自动创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift,但它们不会显示在项目导航器中。
构建项目成功,并且可以像往常一样在代码中使用属性 Entity.attribute。
但是:
如果在 Xcode 导航器中选择 xcdatamodeld 文件,Xcode 编辑器菜单有一个条目“Create NSManagedObject Subclass...”。如果选择此条目和 xxx 数据模型,则会再次创建 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift 2 个文件并显示在项目导航器中,并默认添加到目标中。
这意味着这些文件被添加了两次,因此会出现警告。
所以解决办法就是不使用这个编辑器命令,也不知道是干什么用的……</p>
编辑2:
我的错; 我看错地方了:
- 在项目导航器中打开 xcdatamodeld。
- 在其右侧的窗格中,选择一个实体。
- 在右上角,打开检查器窗格。
- 在它的右上角,选择数据模型检查器。
- 有一个条目“Codegen”,可以选择手动/无。
如果选择此选项,则不会从 xcdatamodeld 自动生成代码,即,可以根据需要手动(通过使用 editor 命令)创建 NSManagedObject 子类,这些子类可以添加到目标 Compile Sources 部分。
上一个答案:
显然有两种使用 CoreData 的方法,或者 1) 仅使用PROJECT.xcdatamodeld
文件,然后将其添加到Compile Sources Build Phase,或者 2) 通过NSManagedObject
使用 Xcode 的Editor/Create NSManagedObject Subclass命令创建子类。
如果使用 1),则一切正常,但对所使用的实体没有属性访问权限。
如果使用 2),Xcode 会创建 2 个文件ENTITY+CoreDataClass.swift
和ENTITY+CoreDataProperties.swift
. 这 2 个文件被添加到编译源构建阶段,但PROJECT.xcdatamodeld
不能。如果仍然这样做,则会收到构建错误“意外重复任务”。但是,如果不这样做,该项目将在没有错误和警告的情况下构建。
但是,在运行时,该指令
let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)!
失败,因为它没有找到数据模型。
一种解决方法是添加PROJECT.xcdatamodeld
到目标/构建阶段/复制捆绑资源。然后代码执行得很好,但是会收到我在问题中描述的警告。
推荐阅读
- swift - SwiftUI:从列表中删除的行不断重新出现
- sql - 如何比较Oracle和SQL Server之间的大表(亿行)数据
- php - 将服务器从 php 5.6 更新到 7.3,出现 PEAR 错误
- gradle - Gradle 插件开发:解决工具伪影的惯用方法
- python - 如何解决 pygsheets 的授权错误?
- php - 我如何制作中间件来控制没有 id ln Laravel 7 项目的无人进入页面
- jpa - 数据库中的更改未反映在 JPA 实体中
- restore - 如何创建自动化和无人值守的 Clonezilla 恢复解决方案
- python - Pandas 列在 Groupby 排序列上创建函数
- android - 使用 Junit5 进行测试时位置对象返回 null