如果没有数据,带有 @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

我了解如何使用NSManagedObjectContextcount(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 不会在新条目上更新

我的 iOS fetchrequest 的奇怪行为有两个部分

Swift 核心数据 FetchRequest NSData 到 UIIMage