CoreData с @FetchRequest (SwiftUI) и NSPredicate дает сбой, если нет данных - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть приложение 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 будет работать.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Так что я иногда ничего не понимаю. Я не прочитал ошибку полностью, так как она произошла в контексте чего-то, что я менял, поэтому я подумал, что проблема в этом. Но нет, это не проблема.

Проблема в том, что в начале дня я переименовал столбец из username в другое. Но я забыл поменять NSPredicate.

Так что ради кого-либо еще использующего SwiftUI и @FetchRequest, если вам нужно посчитать количество предметов, вам нужно будет вернуться к NSFetchRequest, чтобы сделать это. Извините, что зря потратил время.

0 голосов
/ 22 апреля 2020

Ну, у меня есть решение. Это не красиво, но это работает. Поскольку NSManagedObjectContext передается через @Environment, он не инициализируется при запуске SwiftUI View init. Таким образом, чтобы получить контекст, вы можете сделать:

if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext {

и сделать вызов, чтобы получить счет там.

...