mbe*_*erg 5 iphone core-data swift3 ios10
不久前,我将我的一个应用程序更新到 iOS 10,然后我就可以使用它了,从那时起我就一直在我的手机上使用它(安装时没有删除旧应用程序,新应用程序取代了旧应用程序)。现在,当我从 iPhone 中删除该应用程序并重新安装相同的应用程序时,它不起作用。
我一直在尝试通过不同的更改来解决这个问题,并试图了解出了什么问题。我还在 Google 和 Stack Overflow 上搜索过,但没有成功。
我得到的错误是这样的:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“executeFetchRequest:error: 不是有效的 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()
}
Run Code Online (Sandbox Code Playgroud)
它总是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 数据堆栈函数的迁移版本。
我究竟做错了什么?任何帮助或提示将不胜感激!
编辑
当我简化 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")
}
Run Code Online (Sandbox Code Playgroud)
尝试使用:
let entityName = String(describing: Item.self)
let request = NSFetchRequest<Item>(entityName: entityName)
Run Code Online (Sandbox Code Playgroud)
干杯!
| 归档时间: |
|
| 查看次数: |
2622 次 |
| 最近记录: |