从CoreData for iOS 14小部件获取数据

问题描述

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

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

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

解决方法

首先,您需要创建一个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,带有不同的小部件示例,包括核心数据小部件。