NSPredicate | Дает плохое исключение при запросе Entity Fetch | Swift 4 - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь получить сущность через модель NSPredicate от CoreData. Первоначально я вставляю объект, используя его id, и теперь намереваюсь его получить. Однако мой код вылетает без какого-либо дополнительного описания, в частности моего NSPredicate. Я не имею понятия почему? Мой id атрибут Int32:

        var employTime:EmployeeTime?
        let context = getContext()
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "EmployeeTime")

        //code crashes on this bottom line
        let predicate = NSPredicate(format: "id == %@", id)
        fetchRequest.predicate = predicate
        let employTimes = try! context.fetch(fetchRequest) as? [EmployeeTime]
        if (employTimes?.count)! > 0 {
            for et in employTimes! {
                if et.id == id {
                    employTime = et
                }
            }
        } else {
            employTime = EmployeeTime(context: context)
        }
        return employTime!

Любая помощь наиболее ценится.

1 Ответ

0 голосов
/ 16 ноября 2018

Это очень распространенная ошибка.

Заполнитель %@ предназначен только для объектов, для Int32 вам нужно %d или %i

let predicate = NSPredicate(format: "id == %d", id)

Исоздайте запрос на выборку с конкретным подклассом NSManagedObject

let fetchRequest = NSFetchRequest<EmployeeTime>(entityName: "EmployeeTime")

, что позволит избежать приведения типа позже.


Весь ваш код может быть упрощен (дополнительные опции не требуются):

let employTime:EmployeeTime
let context = getContext()
let fetchRequest = NSFetchRequest<EmployeeTime>(entityName: "EmployeeTime")
let predicate = NSPredicate(format: "id == %d", id)
fetchRequest.predicate = predicate
let employTimes = try! context.fetch(fetchRequest)
if let et = employTimes.first {
   employTime = et
} else {
   employTime = EmployeeTime(context: context)
}
return employTime

Однако вам следует избегать try!.Сделайте вашу функцию throw и передайте потенциальную ошибку вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...