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

uma*_*nga 9 core-data swift widgetkit swiftui ios14

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

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

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

paw*_*222 20

首先,您需要创建一个 AppGroup,它将用于创建一个 Core Data Persistent Container(这里有一个很好的解释)

然后你需要创建你自己的 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 { ... }
Run Code Online (Sandbox Code Playgroud)

现在您可以managedObjectContext从共享的 Persistent Container 中获取:

let moc = CoreDataStack.shared.managedObjectContext
Run Code Online (Sandbox Code Playgroud)

并用它执行一个获取请求(更多信息在这里

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

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


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

  • 感谢 pawello2222 的详细回答。为了详细说明 pawello2222 的答案,如果您使用 CloudKit,请将“NSPersistentContainer”替换为“NSPersistentCloudKitContainer”(即使在新创建的 CoreData 堆栈上) (4认同)

归档时间:

查看次数:

4175 次

最近记录:

5 年 前