ios - 带核心数据的 watchOS 2

标签 ios swift core-data apple-watch watchos-2

<分区>

对于 watchOS 1,我的理解是 watch 扩展被放置在 iOS 应用程序中,因此您可以为 watch 应用程序和 iOS 应用程序使用共享的核心数据持久存储(这是通过使用应用程序组完成的,并制作一个单独的框架来处理 iOS 应用和 watch 应用的数据模型。)

但是,在 watchOS 2 中,watch 扩展已经移动到 watch 本身 - 所以它会有自己的持久存储。所以,根据我的说法,我可以直接在 apple watch 上使用核心数据,而无需使用 iOS 应用程序,但是当我为 watchOS 2 创建了一个项目,在你的 watch 应用程序中没有使用核心数据的选项。如果我在 ExtensionDelegate 中添加这些功能:

lazy var applicationDocumentsDirectory: NSURL = {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "finoit.test" in the application's documents Application Support directory.
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
}()

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource("test", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added 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.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() 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.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

// MARK: - Core Data Saving support

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // abort() 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
            NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
        }
    }
}

这些函数永远不会调用,还有其他方法可以在apple watch上使用core data吗?

或者我对具有核心数据的 Apple watchOS 2 概念的理解有误吗?

感谢您的任何建议。

最佳答案

您当然可以将 CoreData 与 watchOS 2 一起使用(我的两个应用程序正在这样做)。创建目标时添加 CoreData 的选项只是一个方便的复选框,Apple 尚未添加。您将需要手动添加上面提到的函数并确保自己调用它们,但它的工作方式与在 iOS 应用程序中一样。

请记住,虽然此数据不会在 watchOS 和 iOS CoreData 商店之间同步,因此如果您需要,您需要使用 Watch Connectivity 自行同步数据。

关于ios - 带核心数据的 watchOS 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32645292/

相关文章:

ios - Swift 1.2 - 根据 NSUserDefaults 值更新 UIPickerView 初始行

iphone - 带有背景图像的 UINavigationController 在 View Controller 被推送或弹出时保持静止并且不动画

ios - 带多重采样的离屏渲染

ios - Angular 6 中的 window.navigator.standalone 丢失了?

ios - 如何在联系人表格 View 顶部显示相同的应用程序用户?

ios - 在 ARSession 期间打开手电筒

iphone - 核心数据 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'

ios - 核心数据托管上下文未保存在多线程环境中

ios - Objective-C 函数通过在方法签名中指定关系来更新 Core Data 关系

ios - Cordova ajax 发布问题