如果没有数据,带有 @FetchRequest (SwiftUI) 和 NSPredicate 的 CoreData 会崩溃
Posted
技术标签:
【中文标题】如果没有数据,带有 @FetchRequest (SwiftUI) 和 NSPredicate 的 CoreData 会崩溃【英文标题】:CoreData with @FetchRequest (SwiftUI) and NSPredicate crashes if there is no data 【发布时间】:2020-04-22 17:32:06 【问题描述】:我有一个 SwiftUI 应用程序,我在其中使用 @FetchRequest
和一个谓词。只要已经有一些数据,一切都可以正常工作。
但是,当第一次安装应用并且用户在输入任何数据之前尝试执行搜索时,应用会崩溃并出现以下错误:
error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x60000188c380> , unimplemented SQL generation for predicate : (username CONTAINS[cd] "r") with userInfo of (null)
我认为问题的原因是该列不存在(因为没有数据)。我想做的是在没有数据的情况下为谓词传递nil
。
我了解如何使用NSManagedObjectContext
和count(for:)
,但在我需要使用它时,并没有真正通过@EnvironmentObject
提供上下文。有没有人对如何处理这个有任何建议。我也看不出try-catch
是如何工作的。
谢谢。
【问题讨论】:
【参考方案1】:好吧,我确实有一个解决方案。它不漂亮,但它确实有效。因为 NSManagedObjectContext
是通过 @Environment
传递的,所以在运行 SwiftUI View
init
时它不会被初始化。因此,要获得上下文,您可以这样做:
if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
并拨打电话以获取计数。
【讨论】:
【参考方案2】:所以有时我很无知。我没有彻底阅读该错误,因为它发生在我正在更改的某些内容的上下文中,所以我认为问题出在此。但不,这不是问题。
问题在于,当天早些时候,我将一列从username
重命名为其他内容。但我忘了更改NSPredicate
。
因此,为了其他使用 SwiftUI 和 @FetchRequest
的人着想,如果您确实需要计算项目数,则需要恢复为 NSFetchRequest
来执行此操作。很抱歉浪费了大家的时间。
【讨论】:
以上是关于如果没有数据,带有 @FetchRequest (SwiftUI) 和 NSPredicate 的 CoreData 会崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在Core Data中使用带有fetchRequest的谓词
带有多个 sortDescriptor 和 Bool 过滤器的 Swift fetchRequest
SwiftUI在FetchRequest中使用带有结构参数的谓词
带有 NSPredicate 的 FetchRequest 不会在新条目上更新