我刚才,我将我的一个应用程序更新到了iOS 10,然后我就开始工作了,从那以后我就一直在手机上使用它(安装后没有移除旧应用程序,新应用程序取代了旧应用程序)。现在,当我从iPhone上移除了应用程序并重新安装了同样的应用程序时,它无法正常工作。
我一直试图通过不同的变化来解决这个问题,并试图了解出了什么问题。我还搜索了谷歌和Stack Overflow,但没有成功。
我得到的错误是:
由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' executeFetchRequest:错误:不是有效的NSFetchRequest。'
这是我的代码,它在应用程序启动的早期执行:
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数据堆栈功能的迁移版本。
我做错了什么?任何帮助或提示都将不胜感激!
答案 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
如果选择“当前产品模块”,则在FileName + CoreDataClass.swift中不需要以下行
@objc(EmployeeDirectory)
<强>从强>
进口基金会
导入CoreData
@objc(EmployeeDirectory)
公共类EmployeeDirectory:NSManagedObject {
}
以强>
进口基金会
导入CoreData
公共类EmployeeDirectory:NSManagedObject {
}
快乐编码:)
答案 2 :(得分:0)
就我而言,我不得不再次在核心数据中建立关系,再次创建NSManagedObject子类,然后错误消失。