从 iOS 14 个小部件的 CoreData 获取数据
Fetch data from CoreData for iOS 14 widget
我想在小部件中显示从 Core Data 获取的数据。但是 @FetchRequest
不适用于小部件。
据我了解,我们必须创建一个应用程序组并创建一个共享持久容器。
我想知道的是如何从该共享持久容器中读取(获取)小部件上的数据,或者简单地说,如何在小部件中显示从核心数据中获取的数据。
首先您需要创建一个 AppGroup,它将用于创建核心数据持久容器(here 很好地解释了如何操作)
然后您需要创建自己的 CoreData 堆栈(当您创建一个启用了 CoreData 的新空项目时可以找到一个示例)。
假设您已经创建了核心数据模型(此处称为 DataModel
),您现在需要将容器 url 设置为自定义共享容器位置:
- Share data between main App and Widget in SwiftUI for iOS 14
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。
我想在小部件中显示从 Core Data 获取的数据。但是 @FetchRequest
不适用于小部件。
据我了解,我们必须创建一个应用程序组并创建一个共享持久容器。
我想知道的是如何从该共享持久容器中读取(获取)小部件上的数据,或者简单地说,如何在小部件中显示从核心数据中获取的数据。
首先您需要创建一个 AppGroup,它将用于创建核心数据持久容器(here 很好地解释了如何操作)
然后您需要创建自己的 CoreData 堆栈(当您创建一个启用了 CoreData 的新空项目时可以找到一个示例)。
假设您已经创建了核心数据模型(此处称为 DataModel
),您现在需要将容器 url 设置为自定义共享容器位置:
- Share data between main App and Widget in SwiftUI for iOS 14
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。