【问题标题】:Fetch data from CoreData for iOS 14 widget从 CoreData for iOS 14 小部件中获取数据
【发布时间】:2021-01-04 06:02:55
【问题描述】:

我想在小部件中显示从 Core Data 获取的数据。但是@FetchRequest 不适用于小部件。

据我了解,我们必须创建一个应用组并制作一个共享的持久容器。

我想知道的是如何从该共享持久容器中读取(获取)小部件上的数据,或者简单地说,如何在小部件中显示从核心数据获取的数据

【问题讨论】:

    标签: swift core-data swiftui ios14 widgetkit


    【解决方案1】:

    首先,您需要创建一个 AppGroup,用于创建 Core Data Persistent Container(here 是一个很好的说明)

    然后您需要创建自己的 CoreData 堆栈(可以在创建启用 CoreData 的新空项目时找到示例)。

    假设您已经创建了 Core Data 模型(此处称为 DataModel),您现在需要将容器 url 设置为您的自定义共享容器位置:

    let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: <your_app_group>)!
    let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
    let description = NSPersistentStoreDescription(url: storeURL)
    
    let container = NSPersistentContainer(name: "DataModel")
    container.persistentStoreDescriptions = [description]
    container.loadPersistentStores { ... }
    

    现在您可以从共享的持久容器中获取managedObjectContext

    let moc = CoreDataStack.shared.managedObjectContext
    

    并使用它执行获取请求(更多信息here

    let predicate = NSPredicate(format: "attribute1 == %@", "test")
    let request = NSFetchRequest<SomeItem>(entityName: "SomeItem")
    let result = try moc.fetch(request)
    

    除了以上所有链接,我建议您还阅读有关 Core Data 的本教程:


    这是一个 GitHub repository,其中包含不同的 Widget 示例,包括 Core Data Widget。

    【讨论】:

    • 感谢 pawello2222 的详细回答。要详细说明pawello2222的答案,如果你使用CloudKit,请将NSPersistentContainer 替换为NSPersistentCloudKitContainer(即使在新创建的CoreData堆栈上)
    • 嘿 pawello2222,非常感谢您的回答和分享 GitHub 存储库。我已经按照该存储库中的代码进行了操作,并且我的小部件完全刷新了。但是我丢失了旧 managedObjectContext 上的所有数据。你能告诉我如何将旧 managedObjectContext 上的数据传输到 CoreData 堆栈中的新 managedObjectContext 吗?
    • @Alex 这是因为您创建了一个新的 NSPersistentContainer ,它与旧的位置不同。您需要将旧容器移动/复制到新位置。这篇文章可能对您有所帮助:iOS 11+ How to migrate existing Core Data to Shared App Group for use in extension?
    • 这是否也适用于自定义核心数据类?
    • @Luca 您需要确保将小部件中所需的所有内容添加到小部件目标中。如果您打算在小部件中使用 Core Data 和自定义类,则需要将它们全部添加到小部件目标中。
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2021-06-13
    • 2020-10-18
    • 2021-03-05
    • 2021-02-06
    • 2021-03-14
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多