Search code examples
swiftswiftuiswiftdata

SwiftData Predicate crash: can't use NULL on left hand side


Every time I run the predicate I get an error
xCode version 15.3
Destination macOS Sonoma, 14.4
Swift 5

@AppStorage(UserDefaults.Constants.selectedFilterName) static var selectedFilterName: String?
@Query(filter: #Predicate<Filter> {
    $0.name == (selectedFilterName ?? "")
}) var selectedFilters: [Filter]

Model:

@Model
class Filter: Hashable, Identifiable {
    var id: String { name }
    let name: String
}

Stack:

can't use NULL on left hand side
(
    0   CoreFoundation                      0x000000019c17eccc __exceptionPreprocess + 176
    1   libobjc.A.dylib                     0x000000019bc66788 objc_exception_throw + 60
    2   CoreData                            0x00000001a29cb744 -[NSSQLGenerator newSQLStatementForRequest:ignoreInheritance:countOnly:nestingLevel:nestIsWhereScoped:requestContext:] + 4040
    3   CoreData                            0x00000001a29ca62c -[NSSQLiteAdapter newSelectStatementWithFetchRequestContext:ignoreInheritance:] + 140
    4   CoreData                            0x00000001a29ca564 -[NSSQLFetchRequestContext _createStatement] + 52
    5   CoreData                            0x00000001a29ca34c -[NSSQLFetchRequestContext fetchStatement] + 172
    6   CoreData                            0x00000001a29ca22c -[NSSQLFetchRequestContext executeRequestCore:] + 28
    7   CoreData                            0x00000001a29c9e94 -[NSSQLStoreRequestContext executeRequestUsingConnection:] + 300
    8   CoreData                            0x00000001a29c9bbc __52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 60

Solution

  • @JoakimDanielson and @malhal - thanks!
    Answer is: @Query(filter: Predicate<Filter>.false) var selectedFilters: [Filter]

    init() {
        selectedFilterName = ""
        var fetchDescriptor = FetchDescriptor<Filter>(predicate: #Predicate { $0.name == (selectedFilterName ?? "") })
        fetchDescriptor.fetchLimit = 1
        _filters = Query(fetchDescriptor)
    }