Базовый объект данных сохраняется без ошибок, но метод извлечения данных не сразу показывает сохраненные результаты - PullRequest
0 голосов
/ 01 марта 2020

Я работаю над приложением iOS (Swift), которое использует основные данные. В этом приложении я использую объект с именем Audit и после завершения аудита я обновил логическое свойство active этого объекта до false. Ниже приведен метод сохранения объекта аудита. Я использовал один и тот же метод для создания и обновления дел.

 class func saveAudit(audit:AuditModel){
        let curntAudit = Utilities.auditDetails(auditId: Int(audit.auditId))
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return }
        let managedContext = appDelegate.persistentContainer.viewContext
        if curntAudit != nil {
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AuditModel")
            fetchRequest.predicate = NSPredicate(format: "auditId == %i", curntAudit!.auditId)
            fetchRequest.returnsObjectsAsFaults = false

            do {
                let results = try managedContext.fetch(fetchRequest) as? [AuditModel]
                if results!.count > 0 {
                    var auditModl = results?.first
                    auditModl!.date = audit.date
                    auditModl!.active = audit.active
                    auditModl!.critical = audit.critical
                    auditModl!.isNew = audit.isNew
                    auditModl!.pDepartments = audit.pDepartments
                    auditModl!.pImages = audit.pImages
                    auditModl!.sended = audit.sended
                    auditModl!.showNa = audit.showNa
                    auditModl!.abbreveation = audit.abbreveation
                    auditModl!.languages = audit.languages
                    auditModl!.templateId = audit.templateId
                    auditModl!.title = audit.title
                    auditModl!.conclusions = audit.conclusions
                    auditModl!.positiveAspects = audit.positiveAspects
                    auditModl!.idControl = audit.idControl
                    auditModl!.idDashboard = audit.idDashboard
                    auditModl!.locationId = audit.locationId
                    auditModl!.styleId = audit.styleId
                    auditModl!.totalComments = audit.styleId
                    auditModl!.totalImages = audit.styleId
                    auditModl!.totalQuestions = audit.styleId
                    auditModl!.majorAspects = audit.majorAspects
                }
            } catch  {
                print("failed")
            }
        } else {
            let auditEntity = NSEntityDescription.entity(forEntityName: "AuditModel", in: managedContext)
            let auditModl = NSManagedObject(entity: auditEntity!, insertInto: managedContext)
            auditModl.setValue(audit.date, forKey: "date")
            auditModl.setValue(audit.active, forKey: "active")
            auditModl.setValue(audit.critical, forKey: "critical")
            auditModl.setValue(audit.isNew, forKey: "isNew")
            auditModl.setValue(audit.pDepartments, forKey: "pDepartments")
            auditModl.setValue(audit.pImages, forKey: "pImages")
            auditModl.setValue(audit.sended, forKey: "sended")
            auditModl.setValue(audit.showNa, forKey: "showNa")
            auditModl.setValue(audit.abbreveation, forKey: "abbreveation")
            auditModl.setValue(audit.languages, forKey: "languages")
            auditModl.setValue(audit.templateId, forKey: "templateId")
            auditModl.setValue(audit.title, forKey: "title")
            auditModl.setValue(audit.conclusions, forKey: "conclusions")
            auditModl.setValue(audit.auditId, forKey: "auditId")
            auditModl.setValue(audit.positiveAspects, forKey: "positiveAspects")
            auditModl.setValue(audit.idControl, forKey: "idControl")
            auditModl.setValue(audit.idDashboard, forKey: "idDashboard")
            auditModl.setValue(audit.locationId, forKey: "locationId")
            auditModl.setValue(audit.styleId, forKey: "styleId")
            auditModl.setValue(audit.totalComments, forKey: "totalComments")
            auditModl.setValue(audit.totalImages, forKey: "totalImages")
            auditModl.setValue(audit.totalQuestions, forKey: "totalQuestions")
            auditModl.setValue(audit.majorAspects, forKey: "majorAspects")
        }

        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Couldn't save. \(error), \(error.userInfo)")
        }
    }

Сразу после обновления флага active пользователь перенаправит на отдельный экран, и на этом экране будет показан список всех объектов аудита, который active == false. Ниже приведен метод получения данных.

 class func finishedAudits() -> [AuditModel]? {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return nil}
        let managedContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AuditModel")
        fetchRequest.predicate = NSPredicate(format: "active == NO")
        fetchRequest.returnsObjectsAsFaults = false

        do {
            let results = try managedContext.fetch(fetchRequest)
            return results as! [AuditModel]
        } catch  {
            print("failed")
            return nil
        }
    }

Проблема в том, что недавно обновленный объект не был получен вышеуказанным способом. Как только я перезапущу приложение, только вышеупомянутый метод показывает недавно обновленный объект. Я пытался исправить это по-разному, но ни один из них не работал. Кто-нибудь знает, что здесь не так? создание managedContext объекта в каждом методе вызывает эту проблему?

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return }
let managedContext = appDelegate.persistentContainer.viewContext

Может кто-нибудь помочь мне с этим? Я застрял с этим несколько дней. Спасибо заранее.

1 Ответ

0 голосов
/ 01 марта 2020

Fetch-запросы запускаются только один раз. Они не обновляются динамически при вставке объектов.

Используйте точку останова, чтобы увидеть, выполняется ли на самом деле ваш метод извлечения перед выполнением вставки, возможно, с помощью какого-либо другого действия или метода, или он фактически не запускается снова после вставки.

Чтобы упростить этот процесс, я бы рекомендовал использовать FetchedResultsController, который контролирует базу данных на предмет изменений, которые будут возвращены соответствующим запросом выборки. См https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller

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