核心数据fetchRequest给出executeFetchRequest:错误:<null>不是有效的NSFetchRequest

时间:2017-01-31 16:59:19

标签: iphone core-data swift3 ios10

我刚才,我将我的一个应用程序更新到了iOS 10,然后我就开始工作了,从那以后我就一直在手机上使用它(安装后没有移除旧应用程序,新应用程序取代了旧应用程序)。现在,当我从iPhone上移除了应用程序并重新安装了同样的应用程序时,它无法正常工作。

我一直试图通过不同的变化来解决这个问题,并试图了解出了什么问题。我还搜索了谷歌和Stack Overflow,但没有成功。

我得到的错误是:

由于未捕获的异常终止应用&#39; NSInvalidArgumentException&#39;,原因:&#39; executeFetchRequest:错误:不是有效的NSFetchRequest。&#39;

这是我的代码,它在应用程序启动的早期执行:

        let allItemFetchRequest: NSFetchRequest<Item>
    if #available(iOS 10.0, *) {
        allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item>
    } else {
        // Fallback on earlier versions
        allItemFetchRequest = NSFetchRequest(entityName:"Item")
    }

    do {
        let searchItems = try self.managedObjectContext.fetch(allItemFetchRequest)

        if searchItems.count == 0 {
            return true
        }
    } catch let error as NSError {
        print("\(#file):\(#function): \(error)::\(error.userInfo)")
    } catch {
        print("\(String(describing: self)):\(#function): fatal error")
        // Remove before release
        fatalError()
    }

它始终在let searchItems = try self.persistentContainer.viewContext.fetch(allItemFetchRequest)行崩溃。

代码用于检查自上次启动以来是否有任何数据,如果没有,我会从文件中向Core Data SQLite DB添加一些数据。所以,之前如果工作,因为我从iOS 10之前版本的应用程序中获得数据,我认为。

如果我绕过此功能并使用let newItem = (NSEntityDescription.insertNewObject(forEntityName: "Item", into: self.managedObjectContext) as! Item)将数据导入数据库,它会正确导入我的所有数据。对我来说,感觉这是我做的第一个获取请求失败 - 插入似乎工作正常。

我在AppDelegate中使用了Apple原始Core数据堆栈功能的迁移版本。

我做错了什么?任何帮助或提示都将不胜感激!

3 个答案:

答案 0 :(得分:4)

修改

当我简化fetchRequest的声明时,我得到了它。而不是使用:

let allItemFetchRequest: NSFetchRequest<Item>
if #available(iOS 10.0, *) {
    allItemFetchRequest = Item.fetchRequest() as! NSFetchRequest<Item>
} else {
    // Fallback on earlier versions
    allItemFetchRequest = NSFetchRequest(entityName:"Item")
}

尝试使用:

let entityName = String(describing: Item.self)
let request = NSFetchRequest<Item>(entityName: entityName)

干杯!

答案 1 :(得分:0)

在我的情况下,其他开发者选择&#34;当前对象模型&#34;对于一个实体并提交给SVN

enter image description here

如果选择“当前产品模块”,则在FileName + CoreDataClass.swift中不需要以下行

  

@objc(EmployeeDirectory)

<强>从
进口基金会 导入CoreData

@objc(EmployeeDirectory)
公共类EmployeeDirectory:NSManagedObject {

}


进口基金会 导入CoreData

公共类EmployeeDirectory:NSManagedObject {

}

快乐编码:)

答案 2 :(得分:0)

就我而言,我不得不再次在核心数据中建立关系,再次创建NSManagedObject子类,然后错误消失。