我正在尝试CoreData
在我的Cocoa Touch Framework中使用.我创建一个简单的项目作为示例:https:
//github.com/JakubMazur/SO41698466
基本上我是按步骤做的:
使用单元测试创建框架
添加CoreData
到项目someDataModel
填充CoreData
一些虚拟实体并将模块更改为Current Product Module
然后我创建SomeClass
开始,它基本上被称为:
.
public class func entityCreation() { Entity(context: CoreDataClass().persistentContainer.viewContext) }
因此,使用lazy
来自CoreData的这个自动生成的代码,这应该创建模型.
在测试中我写道:
.
func testExample() { SomeClass.entityCreation() }
并开始测试
在CoreDataClass
我把断点以下行:
let container = NSPersistentContainer(name: "someDataModel")
然后我在控制台中看到:
[error]错误:无法加载名为someDataModel CoreData的模型:错误:无法加载名为someDataModel的模型
所以我有两个问题:
是否可以在框架内包含Core Data
如果1为真,我可以使用不同的NSPersistentContainer
名字吗?有一种方法可以检查我应该放在那里?
在这里下载项目:https://github.com/JakubMazur/SO41698466
找到并添加解决方案如下
let modelURL = Bundle(for: type(of: self)).url(forResource: "someDataModel", withExtension: "momd")! let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL) let container = NSPersistentContainer(name: "someDataModel", managedObjectModel: managedObjectModel!)
josh-fuggle.. 6
TLDR;
Apple建议您NSPersistentContainer
在框架中子类化。如果这样做,则将搜索定义子类的框架。
因此,您可以简单地:
final class PersistentContainer: NSPersistentContainer { }
然后使用PersistentContainer
而不是NSPersistentContainer
在您的框架中。
在name
初始化只在主束搜索。
要在其他框架中找到托管对象模型,可以按照注释中的建议获取模型URL。
但是,作为替代,您也可以NSPersistentContainer
在框架中子类化,然后name
初始化程序将起作用。
这是WWDC Core Data Best Practices
视频的摘录:
……假设我们要将模型层纳入其自己的框架中。
为此,我们可以在Xcode中创建一个新的框架目标并将代码移入其中。
一切都非常容易,但是当我们将模型移到新目标中时,在内置产品中,目标就从应用程序移到了新框架中,这应该发生,但是现在NSPersistentContainer不知道在哪里可以找到我们的模型不再。
这是因为默认情况下它仅检查主捆绑包。
为什么停在那里?
好吧,对于一个复杂的应用程序而言,搜索所有应用程序捆绑包可能会变得非常缓慢,这并不是您每次堆叠堆栈时都要支付的费用。
我们该如何解决?
好吧,我们可以从框架捆绑包本身中恢复该模型,并使用容器的其他初始化程序之一,就像采用显式托管对象模型的初始化程序一样,但是NSPersistentContainer实际上为您提供了一种方法来更改其搜索的捆绑包。
看,NSPersistentContainer知道何时将其子类化,并且在寻找模型时将使用子类的类型作为提示。
为了利用这一点,我们要做的就是创建一个子类。
它甚至不需要任何内容。
然后,通过容器设置的任何要使用我们模型的代码都可以采用该子类,而持久性容器将代替我们的框架捆绑包中的模型。
https://asciiwwdc.com/2018/sessions/224
Apple建议您NSPersistentContainer
在框架中子类化。如果这样做,则将搜索定义子类的框架。
因此,您可以简单地:
final class PersistentContainer: NSPersistentContainer { }
然后使用PersistentContainer
而不是NSPersistentContainer
在您的框架中。
在name
初始化只在主束搜索。
要在其他框架中找到托管对象模型,可以按照注释中的建议获取模型URL。
但是,作为替代,您也可以NSPersistentContainer
在框架中子类化,然后name
初始化程序将起作用。
这是WWDC Core Data Best Practices
视频的摘录:
……假设我们要将模型层纳入其自己的框架中。
为此,我们可以在Xcode中创建一个新的框架目标并将代码移入其中。
一切都非常容易,但是当我们将模型移到新目标中时,在内置产品中,目标就从应用程序移到了新框架中,这应该发生,但是现在NSPersistentContainer不知道在哪里可以找到我们的模型不再。
这是因为默认情况下它仅检查主捆绑包。
为什么停在那里?
好吧,对于一个复杂的应用程序而言,搜索所有应用程序捆绑包可能会变得非常缓慢,这并不是您每次堆叠堆栈时都要支付的费用。
我们该如何解决?
好吧,我们可以从框架捆绑包本身中恢复该模型,并使用容器的其他初始化程序之一,就像采用显式托管对象模型的初始化程序一样,但是NSPersistentContainer实际上为您提供了一种方法来更改其搜索的捆绑包。
看,NSPersistentContainer知道何时将其子类化,并且在寻找模型时将使用子类的类型作为提示。
为了利用这一点,我们要做的就是创建一个子类。
它甚至不需要任何内容。
然后,通过容器设置的任何要使用我们模型的代码都可以采用该子类,而持久性容器将代替我们的框架捆绑包中的模型。
https://asciiwwdc.com/2018/sessions/224