Swift 从iOS 14小部件的CoreData获取数据

Swift 从iOS 14小部件的CoreData获取数据,swift,core-data,swiftui,ios14,widgetkit,Swift,Core Data,Swiftui,Ios14,Widgetkit,我想在小部件中显示从核心数据获取的数据。但是@FetchRequest在小部件上不起作用 据我所知,我们必须创建一个应用程序组并创建一个共享的持久容器 我想知道的是如何从共享的持久化容器中读取(获取)小部件上的数据,或者简单地说,如何在小部件中显示从核心数据获取的数据首先,您需要创建一个应用组,该应用组将用于创建核心数据持久化容器(这是一个很好的解释) 然后,您需要创建自己的CoreData堆栈(在启用CoreData的情况下创建新的空项目时可以找到一个示例) 假设您已经创建了核心数据模型

我想在小部件中显示从核心数据获取的数据。但是
@FetchRequest
在小部件上不起作用

据我所知,我们必须创建一个应用程序组并创建一个共享的持久容器


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

首先,您需要创建一个应用组,该应用组将用于创建核心数据持久化容器(这是一个很好的解释)

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

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

并使用它执行提取请求(更多信息)

let predicate=NSPredicate(格式:“attribute1==%@”,“test”)
let request=NSFetchRequest(entityName:“SomeItem”)
let result=尝试moc.fetch(请求)
除了上面的所有链接之外,我建议您也阅读本教程中有关核心数据的内容:



下面是一个包含不同小部件示例的示例,包括核心数据小部件。

感谢pawello2222提供了详细的答案。要详细说明pawello2222的答案,如果您使用CloudKit,请将
NSPersistentContainer
替换为
NSPersistentCloudKitContainer
(甚至在新创建的CoreData堆栈上)。嘿,pawello2222,非常感谢您的答案和共享GitHub存储库。我遵循了存储库中的代码,我的小部件刷新得非常好。但我丢失了旧managedObjectContext上的所有数据。您能告诉我如何将旧managedObjectContext上的数据传输到CoreData堆栈中的新managedObjectContext吗?@Alex这是因为您创建了一个新的NSPersistentContainer,它位于与旧容器不同的位置。您需要将旧容器移动/复制到新位置。这篇文章可能会帮助你:非常感谢@pawello2222@Luca您需要确保小部件中需要的所有内容都添加到小部件目标中。如果计划在小部件中使用核心数据和自定义类,则需要将它们全部添加到小部件目标中。
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 { ... }
let moc = CoreDataStack.shared.managedObjectContext
let predicate = NSPredicate(format: "attribute1 == %@", "test")
let request = NSFetchRequest<SomeItem>(entityName: "SomeItem")
let result = try moc.fetch(request)