【发布时间】:2021-05-26 14:31:18
【问题描述】:
我正在尝试在框架中实现 CoreData。该框架是几个不同应用程序的一部分,因此数据库需要包含在框架内(而不是在应用程序的某个位置拥有自己的类)。
我正在关注 ViewController 和 AppDelegate 管理应用程序初始化的示例。再次,框架,所以结构不同。我的框架中有 6 个类,但只有两个类可以访问数据库,所以我将它放在负责繁重工作的游戏中。
在我拥有的 Game 的类定义中,
// CoreData stuff
let context: NSManagedObjectContext?
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Word")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
我需要一次性用单词列表初始化数据库,所以我有一个函数
public func initCD() {
do {
context = persistentContainer.viewContext
var words = try context?.fetch(Word.fetchRequest())
print("starting count \(words?.count)")
if words?.count == 0 {
print(words?.count)
getTextFile(words?.count)
words = try context?.fetch(Word.fetchRequest())
print(words?.count)
} else {
print("alneady saved \(words?.count) words")
}
} catch {
print("not happening")
}
}
但是当它在Cannot find 'Word' in scope 的两个地方引用Word 时,这会令人窒息。它调用的函数getTextFile() 做同样的事情,但我不怀疑解决这个问题一次将解决它无处不在....
这里有一个明显的错误假设吗?实体定义如下所示
编辑:
我找到了一个很好的指南,它可以更轻松地将基于 AppDelegates 并在 ViewController 中具有 coredata 功能的先前版本转换为我的框架模型。你可以在这里找到它:https://medium.com/@yoellev8/sharing-a-core-data-model-with-a-swift-framework-5d191ccec99e
待我的工作代码更完整后,我会发布它。
【问题讨论】:
-
我建议再次将模型命名为与实体相同的名称,但无论如何从屏幕截图中看起来模型是用小写 w 拼写的,但您在代码中使用了大写 w,
let container = NSPersistentContainer(name: "Word"),所以你需要改变它,因为 name 参数是区分大小写的 -
嗨 Joakim——这似乎不是问题;我尝试将 xcdata 文件重命名为 wordModel.xcdatamodeld,然后将实体保留为 Word,并将类名更改为 Word,没有区别。对我来说,无论在哪里生成类,似乎都超出了范围。
-
我认为清洁和建筑应该有效。试试
CMD+Shift+K,然后是CMD+B。 -
您确实将呼叫更改为
let container = NSPersistentContainer(name: "wordModel")?此外,在 Core Data 中进行此类更改(重命名)时,最好清理构建文件夹以确保删除任何旧的二进制文件。 -
是的,但请参阅上面的编辑添加内容。感谢您的帮助,Joakim 和 Niall