Swift 包中的 CoreData 模型

问题描述 投票:0回答:3

我正在尝试将 CoreData 模型放入 Swift 包中,以从我的主代码库中提取我的模型代码/类。

我已执行以下操作来重新创建我遇到的问题:

  • 创建一个名为 SampleModelPackage 的新 swift 包(文件 -> 新建 -> Swift 包)
  • 创建了核心数据模型定义文件(创建文件 -> 新建 -> 文件 | iOS -> 核心数据 -> 数据模型)
  • 将其与自动生成的 SampleModelPackage.swift 一起保存在 Sources/SampleModelPackage 目录中

现在 - 当我尝试在 Xcode 中打开 Model.xcdatamodelId 文件时,它只向我显示一个“版本”图标(参见屏幕截图),而在项目或框架中创建核心数据模型文件将允许我编辑模型。

第二个/后续问题是我如何像平常一样扩展代码宝石模型文件?我将如何加载该模型定义(通常我会使用捆绑包 ID 和模型文件名)

我尝试将模型文件添加到 Package.swift 文件的资源数组中(使用 .process 和使用 .copy),如本页所述:https://developer.apple.com/documentation/swift_packages/bundling_resources_with_a_swift_package

或者更一般地说,这可能吗? (这篇文章https://ishabazz.dev/blog/2020/7/5/using-core-data-with-swift-package-manager似乎暗示像这样打包核心数据模型是可能的)

(我使用的是 Xcode 12.4)

swift xcode swift-package-manager
3个回答
6
投票

您需要在普通的 Xcode 项目中创建 Core Data 模型,然后您可以创建包并将模型拖到其中。 (如果你仔细看的话,这也是链接文章中所做的,尽管没有明确描述)。

我相信最好的办法是手动为您的实体生成源代码文件并将它们添加到您的包中。您使用

Bundle
加载模型,但使用
Bundle.main
 而不是 
Bundle.module


3
投票

将您的

Core Data Model
文件放入名为
Resources
的目录中,从而使您的文件位于
Sources/MyLibrary/Resources

就您而言,是

Sources/SampleModelPackage/Resources/Model.xcdatamodeld


0
投票

如果您有包并且 .xcdatamodel 在包中,只需使用:

let mom: NSManagedObjectModel
if let model = NSManagedObjectModel.mergedModel(from: [BundleReference.bundle]) {
     mom = model
} else {
     mom = NSManagedObjectModel()
     print("💥 CoreData Error: Failed to load managed object model. Initializing with an empty model.")
}
 
container = NSPersistentContainer(name: "YourModelName", managedObjectModel: mom)
© www.soinside.com 2019 - 2024. All rights reserved.