Как добавить поддержку Core Data в приложение для часов?

У меня есть приложение для iOS, которое использует основные данные для хранения постоянных данных. Когда мое приложение Apple Watch сопровождает приложение, эти данные отправляются на часы, и если данные не совпадают в часах, они обновляют данные часов. SchoolCompanion.xdatamodeld - это моя модель coreData, цели как (приложение для iOS и расширение для часов) Как работают основные данные на моем iOS-приложении? 1. Я создал фальшивый проект, скопировал и вставил его в свой appDelegate.swift // MARK: - Базовый стек данных

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
     */
    let container = NSPersistentContainer(name: "SchoolCompanion")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

Я изменил имя NSPersistentContainer на имя моего проекта: "SchoolCompanion", базовая модель данных имеет то же имя (я не знаю, важно ли это) 1. Я создал файл swift с именем Core DataHelper.swift, чтобы выполнить запрос на выборку, и другие вещи с моим coreData, например: import UIKit import Core Data

class CoreDataHelper {

    // récupérer base CoreData
    private let appDel = UIApplication.shared.delegate as! AppDelegate

    // Récupérer le contexte
    var context : NSManagedObjectContext {
        return appDel.persistentContainer.viewContext
    }

    // Sauvegarder dans CoreData
    func save() {
        appDel.saveContext()
    }   

    // ajoute le cours dans coreData
    func saveCourse(nom : String, debut: Date, fin: Date, color: Int, prof : String, local : String, day: String) {

        let course = Course(context: context)
        course.nom = nom
        course.heureDebut = debut
        course.heureFin = fin
        course.strProf = prof
        course.strLocal = local
        course.color = Int64(color)
        course.day = day
        save()
        print("cours ajouté")
    }

    // supprime le cours de CoreData
    func deleteCourse(cours: Course) {
        context.delete(cours)
        do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }
    }

    // renvoie le tableau de tout les cours confondus dans l'odre croissant
    var courses : [Course] {
        let courseRequest: NSFetchRequest<Course> = Course.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "heureDebut", ascending: true)
        courseRequest.sortDescriptors =  [sortDescriptor]
        var coursestbl : [Course] = []
        do {
            coursestbl = try context.fetch(courseRequest)
        } catch {
            print(error.localizedDescription)
        }
        return coursestbl
    }

    // renvoie un tableau des cours du lundi
    var coursesLun : [Course] {
        let courseRequest: NSFetchRequest<Course> = Course.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "heureDebut", ascending: true)
        courseRequest.sortDescriptors =  [sortDescriptor]
        var coursestbl : [Course] = []
        do {
            coursestbl = try context.fetch(courseRequest)
        } catch {
            print(error.localizedDescription)
        }
        var coursLundiTbl : [Course] = []
        for c in coursestbl {

            if c.day == "LUNDI" {
                coursLundiTbl.append(c)
            }
        }
        return coursLundiTbl
    }
}

Это для моего iOS-приложения, и оно отлично работает! Давайте теперь поговорим о моем приложении для часов, что я сделал?

  1. В моем ExtensionDelegate я скопировал и вставил методы для coreData из AppDelegate.swift (то же, что и выше)
  2. Я создал Core DataHelper тоже:

    class CoreDataHelper {
    
        var context : NSManagedObjectContext {
            return ExtensionDelegate().persistentContainer.viewContext
        }
    
        // Sauvegarder dans CoreData
        func save() {
            ExtensionDelegate().saveContext()
        }
    
        // ajoute le cours dans coreData
        func saveCourse(cours : Course) {
    
            let course = Course(context: context)
            course.nom = cours.nom
            course.heureDebut = cours.heureDebut
            course.color = cours.color
            course.day = cours.day
            //save()
            do {
            try context.save()
            print("context saved successfully")
            } catch {
                print(error.localizedDescription)
            }
        }
    
        // ajoute le cours dans coreData
        func saveCourse(nom : String, debut: Date, color: Int, day: String) {
    
            let course = Course(context: context)
            course.nom = nom
            course.heureDebut = debut
            course.color = Int64(color)
            course.day = day
            save()
            print("cours ajouté")
        }
    
        // supprime le cours de CoreData
        func deleteCourse(cours: Course) {
            context.delete(cours)
            do {
                try context.save()
            } catch {
                print(error.localizedDescription)
            }
        }
    
        // renvoie le tableau de tout les cours confondus dans l'odre croissant
        var courses : [Course] {
            get {
                let courseRequest: NSFetchRequest<Course> = Course.fetchRequest()
                let sortDescriptor = NSSortDescriptor(key: "heureDebut", ascending: true)
                courseRequest.sortDescriptors =  [sortDescriptor]
                var coursestbl : [Course] = []
                do {
                    coursestbl = try context.fetch(courseRequest)
                } catch {
                    print(error.localizedDescription)
                }
                return coursestbl
            }
        }
    }
    

Поэтому, когда приложение запускается, оно пытается обновить данные Apple Watch с coreData, сохранение выполнено успешно, но запрос на выборку всегда возвращает пустые массивы. Я снимаю coreData не работают на моих часах, но почему?

Возможно, это могло бы помочь?

Как добавить стек основных данных в приложение WatchKit

Поддержка основных данных в приложении на основе страниц

Ссылка на репозиторий Git: https://github.com/CedricLnx/School-Companion

0 ответов

Другие вопросы по тегам