【问题标题】:CoreData error: Must supply a fetch request during initializationCoreData 错误:必须在初始化期间提供获取请求
【发布时间】:2021-03-01 20:35:07
【问题描述】:

我的所有 CoreData UnitTests 都有以下代码设置(其中 context 是我的 viewContextItem 是 CoreData 模型):

override func setUpWithError() throws {
    let deleteReq = NSBatchDeleteRequest(fetchRequest: Item.fetchRequest())
    try context.execute(deleteReq)
}

现在,我在声明 deleteReq 时收到此错误:

必须在初始化期间提供获取请求 (NSInvalidArgumentException)

我这样设置我的控制器:

let testController = PersistenceController(inMemory: true)

// #### - ####

init(inMemory: Bool = false) {
    container = NSPersistentCloudKitContainer(name: "AppName")
    if inMemory {
        container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
    }
    
    container.viewContext.automaticallyMergesChangesFromParent = true
    container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        // [...]
        return
    })
}

我是不是做错了什么?

【问题讨论】:

    标签: ios core-data nsmanagedobjectcontext nsfetchrequest nspersistentcloudkitcontainer


    【解决方案1】:

    ETA:这实际上并没有帮助??‍♂️我将两个不同的问题混为一谈,这个答案解决了另一个问题。对不起。如果您找到问题的答案,请联系 lmk。我也会这样做。


    我今天也遇到了这个问题 - 几乎完全相同的设置,所以希望对我有用的方法会对你有所帮助。

    事实证明,这与我试图将上下文带入测试的方式有关,这使得错误消息非常具有误导性。我在我的 dataController 中添加了一个主上下文的属性,并在我的测试中引用了它,它现在可以工作了。

    在应用程序中,DataController.swift(我还必须将此文件添加到测试目标):

    class DataController: ObservableObject {
        let container: NSPersistentCloudKitContainer
        let moc: NSManagedObjectContext
    
        init(inMemory: Bool = false) {
            container = NSPersistentCloudKitContainer(name: "Main") // or "AppName"
        
            if inMemory {
                container.persistentStoreDescriptions.first?.url = URL(fileURLWithPath: "/dev/null")
            }
        
            container.loadPersistentStores { (storeDescription, error) in
                if let error = error {
                    fatalError("Fatal error loading store: \(error.localizedDescription)")
                }
            }
        
            moc = container.viewContext
        }
    
        ...
    
        func deleteAll() {
            let fetchRequest: NSFetchRequest<NSFetchRequestResult> = EntityName.fetchRequest()
            let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
            _ = try? container.viewContext.execute(batchDeleteRequestSteps)
        }
    }
    

    在我的测试中:

    class SomeTests: XCTestCase {
    
        var dataController = DataController()
    
        override func setUpWithError() throws {
            let context: NSManagedObjectContext = dataController.moc
            dataController.deleteAll()
            let entityTestObj = EntityName(context: context)
            
            // some setup stuff here
    
            dataController.save()
        }
    
        // ... actual tests here
    }
    

    【讨论】:

      【解决方案2】:

      好的,我有一个简单的解决方案,但并不理想:

      var testController = PersistenceController(inMemory: true)
      
      override func setUpWithError() throws {
          testController = PersistenceController(inMemory: true)
      }
      

      正如我所说,不理想.. 但它按预期工作。每个测试的新(空)控制器/容器。

      不完全确定导致错误的原因。从“/dev/null”中删除东西可能有一些问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        相关资源
        最近更新 更多