Как добавить поддержку 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-приложения, и оно отлично работает! Давайте теперь поговорим о моем приложении для часов, что я сделал?
- В моем ExtensionDelegate я скопировал и вставил методы для coreData из AppDelegate.swift (то же, что и выше)
Я создал 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