【问题标题】:How Do I Get This Implementation of CoreData to Work in my Framework?如何让 CoreData 的这种实现在我的框架中工作?
【发布时间】: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

标签: ios swift core-data


【解决方案1】:

我认为 Project Clean and Build 应该可以工作。尝试CMD+Shift+K,然后尝试CMD+B。我认为问题在于它可以在文件中找到对象。这应该允许您毫无问题地引用 Word 实体。

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 2016-05-14
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多