将数据从 Core Data 加载到 Today Widget

Posted

技术标签:

【中文标题】将数据从 Core Data 加载到 Today Widget【英文标题】:Load data from Core Data to Today Widget 【发布时间】:2017-12-21 18:58:59 【问题描述】:

我有一个用 Swift 编写的 ios 应用程序,它适用于 Core Data。 不,我想获取 Core Data 中存在的最后一条记录并将其呈现在 Today Widget Extension 中。

    我在我的项目中添加了新的小部件目标 在我的 coredata.xcdatamodeld 中,我还检查了扩展的目标成员身份 对于两个目标(应用程序和扩展程序),我添加并启用了专门创建的应用程序组 group.myapp.sharingForTodayExtension

    这是我来自 TodayViewController 的代码

    import UIKit
    import NotificationCenter
    import CoreData
    
    class TodayViewController: UIViewController, NCWidgetProviding 
    
            var managedObjectContext : NSManagedObjectContext?
    
            override func viewDidLoad() 
                    super.viewDidLoad()
    
           let container = PersistentContainer(name: "containerName")
           container.loadPersistentStores  (storeDesc, error) in
           if let error = error 
            print("Widget Core Data loading error.... \(error)")
            return
           
    
        print("loaded fine")
        self.managedObjectContext = container.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "appEntities")
    
        if let fetchResults = (try? self.managedObjectContext?.fetch(fetchRequest)) as? [myCoreDataObjectType] 
            print("records count = \(fetchResults.count)")
        
    

这里是 PersistentContainer 的特殊类

class PersistentContainer: NSPersistentContainer
     override class func defaultDirectoryURL() -> URL
    return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.myapp.sharingForTodayExtension")!


override init(name: String, managedObjectModel model: NSManagedObjectModel) 
    super.init(name: name, managedObjectModel: model)

问题是它表明 records count = 0

【问题讨论】:

【参考方案1】:

当您更改defaultDirectoryURL 返回的值时,您更改了持久存储文件的位置。您的应用在此更改之前已经拥有的任何数据都应该仍然存在,但在旧位置。

如果您需要保留对现有数据的访问权限,并且该数据可供应用和扩展程序使用,则需要将旧数据移至新的共享位置。

您可以通过几种方式做到这一点。

使用NSPersistentStoreCoordinator 将旧数据加载到应用程序中,然后使用其migratePersistentStore(_:to:options:withType:) 方法将数据移动到新的持久存储中。 使用FileManager 移动文件。除了主持久存储文件之外,请确保获取两个日志文件。如果您有允许外部存储的二进制属性,这可能会很棘手。 创建两个NSPersistentContainer 实例,一个用于旧位置,一个用于新位置,然后编写您自己的代码以从其中一个读取对象并在另一个中创建副本。

【讨论】:

您能否用第一个解决方案的示例更新答案?或者,也许您可​​以展示如何在不更改 defaultDirectoryURL 返回的值的情况下访问核心数据?

以上是关于将数据从 Core Data 加载到 Today Widget的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Today Extension (iOS 8) 访问 Core Data/CloudKit

将 Core Data 数据库从一个应用程序迁移到另一个应用程序

难以调试 iPhone Core Data 错误

Core Data iOS 8 Today Widget 问题

当用户滚动 MKMapView 时,从 Core Data 加载其他对象

从 Core Data 加载图像使 NavigationView 过渡变得跳跃